20分求助
查看原帖
20分求助
173056
_Veritas楼主2021/4/16 19:34

思路: 枚举k 排序 枚举j 二分i

评测记录

#include<algorithm>
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
inline int read(){
	int x=0;char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
int n,a[200005],b[200005],mod,ans;
int find(int x){//find largest y where b[y]<=x
	int l=2,r=n,ans=1,mid;
	while(l<=r){
		mid=((l+r)>>1);
		if(b[mid]<=x) ans=mid,l=mid+1;
		else r=mid-1;
	}
	return ans;
}
signed main(){
	n=read();
	for(int i=1;i<=n;++i) a[i]=read();
	for(int k=1;k<=n;++k){
		for(int j=1;j<=n;++j) b[j]=a[j]%a[k];
		sort(b+1,b+n+1);
		for(int j=2,i;j<=n;++j){
			i=find(a[k]-b[j]-1);
			if(i==j) --i;
			if(i!=1) ans=max(ans,(b[i]+b[j])%a[k]);
			ans=max(ans,(b[n]+b[j])%a[k]);
		}
	}
	cout<<ans;
}
2021/4/16 19:34
加载中...