基准时间限制: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;
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<math.h> 5 #include<stdlib.h> 6 #include<queue> 7 #include<iostream> 8 int ans[300000]; 9 int bns[300000]; 10 int ap[1000005]; 11 using namespace std; 12 int main(void) { 13 int n; 14 scanf("%d",&n); 15 int i,j; 16 int maxx = 0; 17 for(i = 0; i < n; i++) { 18 scanf("%d",&ans[i]); 19 maxx = max(ans[i],maxx); 20 } 21 sort(ans,ans+n); 22 int cn = 0; 23 bns[cn++] = ans[0]; 24 int t =bns[0]; 25 for(i = 1; i < n; i++) { 26 if(ans[i]!=t) { 27 t = ans[i]; 28 bns[cn++] = t; 29 } 30 } 31 if(n == 1) { 32 printf("0\n"); 33 } else { 34 int ask = 0; 35 for(i = cn-1; i >= 0; i--) { 36 if(bns[i]!=1) { 37 for(j = 2; bns[i]*j <= maxx+bns[i]; j++) { 38 int l = i+1,r = cn-1; 39 int id = -1; 40 while(l <= r) { 41 int mid = (l+r)/2; 42 if(bns[mid] < bns[i]*j) { 43 id = mid; 44 l = mid + 1; 45 } else r = mid-1; 46 } 47 if(id!=-1) 48 ask = max(bns[id]%bns[i],ask); 49 } 50 } 51 if(ask >= bns[i])break; 52 } 53 printf("%d\n",ask); 54 } 55 return 0; 56 }
时间: 2024-10-14 15:54:13