Maximum Value CodeForces

来源:互联网 发布:python怎么多线程并发 编辑:程序博客网 时间:2024/06/06 01:32

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
33 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;}/*64 7 9 10 12 18 308101 7 8 4 5 6 9 85 14 206201 7 8 6 4 2 9 5 12 15 20 45 82 65 24 54 456 123 754 654298*/
第二个优化最关键,避免二分时一直到上届吧。




原创粉丝点击