最大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; }