凭直觉模数应该比较大,所以枚举前 500 大的模数。同时 ai 和 aj 应该离它不远,于是 O(n3) 枚举应运而生。剪枝:如果当前答案已经 ≥ak,那么就没必要往下枚举了。跑的飞快,仅161ms,比许多正解都快。
#include <bits/stdc++.h>
using namespace std;
const int N=200005;
int n,ans=0,a[N];
bool cmp(int x,int y){
return x>y;
}
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*f;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
sort(a+1,a+n+1,cmp);
for(int k=1;k<=min(n,500);k++){
if(ans>=a[k]) break;
for(int i=max(1,k-250);i<=max(n,k+250);i++){
if(i==k) continue;
for(int j=i+1;j<=min(n,k+250);j++){
if(j==k) continue;
ans=max(ans,(a[i]+a[j])%a[k]);
}
}
}
cout<<ans<<endl;
}