首页 > 代码库 > 1421 最大MOD值
1421 最大MOD值
1421 最大MOD值
基准时间限制: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示例
33 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 }
1421 最大MOD值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。