最大mod值(暴力枚举+二分)

1421 最大MOD值

有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj,使得 ai mod aj 最大并且 ai  aj

 

输入

单组测试数据。
第一行包含一个整数n,表示数组a的大小。(1 ≤ n ≤ 2*10^5)
第二行有n个用空格分开的整数ai (1 ≤ ai ≤ 10^6)。

输出

输出一个整数代表最大的mod值。

输入样例

3
3 4 5

输出样例

2


这个题一看复杂度,没有想到是暴力,结果还挺暴力
就是n*log(n)*(n的调和级数)的复杂度
就是对于每一个a[i]的倍数,然后再二分
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=5e6+100;
int a[maxn];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    n=unique(a+1,a+n+1)-(a+1);
    int ma=0;
    for(int i=1;i<=n;i++){
        for(int j=(a[i]<<1);j<=a[n];j+=a[i]){//枚举它的倍数
            int p=lower_bound(a+1,a+n+1,j)-a;//大于它的倍数的下标p
            if(p>i){
                ma=max(ma,a[p-1]%a[i]);//a[p]%a[i]是最大的    
            }
        } 
        ma=max(ma,a[n]%a[i]);
    }
    cout<<ma<<endl;
}


原文地址:https://www.cnblogs.com/lipu123/p/14727198.html