Maximum Value(CodeForces - 484B)
Maximum Value
Time limit 1000 ms
Memory limit 262144 kB
You are given a sequence a consisting of n integers. Find the maximum possible value of (integer remainder of ai divided by aj), where 1 ≤ i, j ≤ n and ai ≥ aj.
Input
The first line contains integer n — the length of the sequence (1 ≤ n ≤ 2·105).
The second line contains n space-separated integers ai (1 ≤ ai ≤ 106).
Output
Print the answer to the problem.
Example
Input
3
3 4 5
Output
2
题意:求aj%ai的最大值,其中j>i;
分析:每次寻找小于k*aj的最大值,类似于素数筛,例如n=5时,3 4 5 6 7 ,我们如果查找对3取模的最大值,毫无疑问就是找到3到2*3中间的最大值;
AC代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 2*100000+10
const int maxn=1000000+10;
typedef long long ll;
using namespace std;
int a[N];
int n;
int C(int x){
int w=x,ans=0;
while (w<a[n-1]){
w+=x;
int k=lower_bound(a,a+n,w)-a;
if (k==0) continue;
else k--;
if (a[k]<=x) continue;
ans=max(ans,a[k]%x);
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
int ans=0;
scanf("%d",&n);
for (int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
for (int i=n-1;i>=0;i--){
if (i<n-1&&a[i]==a[i+1])
continue;
if (ans>=a[i]-1)
break;
ans=max(ans,C(a[i]));
}
printf("%d\n",ans);
return 0;
}