您的位置:首页 > 其它

51nod1421 最大MOD值

2018-03-08 21:43 239 查看
有一个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

题解:这题众dalao应该讲的很详细了吧。
先把A排序,再枚举a[j]作为模数,以及(枚举一个k)使a[j]*k大于a[i],这个的复杂度应该是 ( n * lg ( max(a) ) )的吧~然后求出小于a[j]*k的最大的a[i],这个可以二分。但是如果二分就是( n * lg ( max( a[i] ) ) * lg( n ) )…其实这一步可以O( 1 )求,对于1<=每个数<=1000000,先预处理出小于它的最大的a[i]就好啦,( n * lg ( max( a[i] ) ) )~

代码:#include<bits/stdc++.h>
using namespace std;
int n,i,j,ans,a[2000001],v[2000001],g[2000001];
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
v[a[i]]=1;
}
for(i=1;i<=2000000;i++)
if(v[i])g[i]=i;
else g[i]=g[i-1];
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
if(a[i]!=a[i-1]){
for(j=2;j*a[i]<=2000000;j++){
if(g[j*a[i]-1]>(j-1)*a[i])ans=max(ans,g[j*a[i]-1]%a[i]);
}
}
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: