1421 最大MOD值
2016-09-07 19:28
204 查看
1421 最大MOD值
基准时间限制:1 秒 空间限制:131072 KB
有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。
Input
Output
Input示例
Output示例
基准时间限制:1 秒 空间限制:131072 KB
有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。
Input
单组测试数据。 第一行包含一个整数n,表示数组a的大小。(1 ≤ n ≤ 2*10^5) 第二行有n个用空格分开的整数ai (1 ≤ ai ≤ 10^6)。
Output
输出一个整数代表最大的mod值。
Input示例
3 3 4 5
Output示例
2 思路:二分; 找最大的mod,我们先去重,然后循环每个数的倍数,二分找小余倍数的最大的值,这个用筛法,然后更新最大的答案。复杂度n*(logn)^2;
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> #include<iostream> int ans[300000]; int bns[300000]; int ap[1000005]; using namespace std; int main(void) { int n; scanf("%d",&n); int i,j; int maxx = 0; for(i = 0; i < n; i++) { scanf("%d",&ans[i]); maxx = max(ans[i],maxx); } sort(ans,ans+n); int cn = 0; bns[cn++] = ans[0]; int t =bns[0]; for(i = 1; i < n; i++) { if(ans[i]!=t) { t = ans[i]; bns[cn++] = t; } } if(n == 1) { printf("0\n"); } else { int ask = 0; for(i = cn-1; i >= 0; i--) { if(bns[i]!=1) { for(j = 2; bns[i]*j <= maxx+bns[i]; j++) { int l = i+1,r = cn-1; int id = -1; while(l <= r) { int mid = (l+r)/2; if(bns[mid] < bns[i]*j) { id = mid; l = mid + 1; } else r = mid-1; } if(id!=-1) ask = max(bns[id]%bns[i],ask); } } if(ask >= bns[i])break; } printf("%d\n",ask); } return 0; }
相关文章推荐
- 51 nod 1421 最大MOD值
- 51nod 1421 最大MOD值
- 51nod 1421 最大MOD值(思维)
- 51nod-1421 最大MOD值
- 51nod 1421 最大MOD值 (暴力枚举)
- [乱搞]51 Nod 1421——最大MOD值
- [51nod 1421]最大MOD值
- 51nod 1421 最大mod值 (排序+二分搜索)
- 51nod 1421:最大MOD值
- 51nod 1421:最大MOD值
- 51Nod-1421-最大MOD值
- 51nod 1421 最大MOD值 | 暴力
- 【数学】51Nod 1421 最大MOD值
- 51nod1421 最大MOD值
- ural 1421(建图求最大流后求某些边的使用量)
- LightOJ 1421 Wavio Sequence 最大上升子序列变形 双dp
- toj 1421 最大流sap
- 最大MOD值
- 51 nod 1421 最大mod值 思维题
- 51nod 1421 最大MOD值 & codeforces 485D Maximum Value(思维 数学)