您的位置:首页 > 其它

1421 最大MOD值

2016-09-07 19:28 204 查看
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示例
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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: