B. Maximum Value
题意:给n(至多200000)个数a1~an,数的范围是1~1000000,找出最大的aimodaj,要求ai>=aj。
思路:对1~1000001中的每个数,找出比它小且最接近它的ai。然后枚举每个不同的aj,对每个数枚举它在1000000内的倍数,答案就可能出现在比这个倍数小的最大的ai上。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
using namespace std;
bool flag[2000010];
int pre[2000010];
int main(){
int n;
cin>>n;
int num;
for(int i=1;i<=n;i++){
scanf("%d",&num);
flag[num]=1;
}
for(int i=1;i<=1000001;i++){
if(flag[i-1]) pre[i]=i-1;
else pre[i]=pre[i-1];
}
int ans=0;
for(int i=1;i<=1000000;i++){ //不能枚举a[1]~a[n],因为这样做如果有很多个很小的数就会跪
if(!flag[i])continue;
for(int j=2*i;;j+=i){
j=min(j,1000001); //注意不要写成1000000
ans=max(ans,pre[j]%i);
if(j==1000001)break;
}
}
cout<<ans<<endl;
return 0;
}