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.
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).
Print the answer to the problem.
Input
3 3 4 5
Output
2
乱搞的优化,然后就过了23333.
不难想找到大于等于倍数的第一个数。然而看上去复杂度应该比较勉强n*logn可以过。两个优化。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
int n;
int num[MAXN];
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; ++i)scanf("%d",&num[i]);
sort(num,num+n);
int ans = 0;
for(int i = n-1; i >=0 ; --i)
{
if(ans > num[i] - 1)break;
if(num[i] == num[i+1])continue;
for(int j = num[i]<<1; ; j+=num[i])
{
int d = lower_bound(num+i+1,num+n,j) - num;
d--;
//cout << num[i]<<" " <<num[d] <<" "<<num[d] % num[i]<< endl;
d = num[d] % num[i];
ans = ans>d?ans:d;
if(j > num[n-1])break;
}
}
printf("%d\n",ans);
return 0;
}
/*
6
4 7 9 10 12 18 30
8
10
1 7 8 4 5 6 9 85 14 20
6
20
1 7 8 6 4 2 9 5 12 15 20 45 82 65 24 54 456 123 754 654
298
*/
第二个优化最关键,避免二分时一直到上届吧。