求卡人类智慧
查看原帖
求卡人类智慧
484910
SwordDance楼主2024/11/11 19:34

RT,做法是枚举最大的 200 个数作为 k,然后线性归并+双指针求当前最大答案。洛谷和 UOJ 都可以过,但是感觉可以卡掉,想了很久还是卡不掉。

代码如下,有没有 dalao 可以造组 hack。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+3;
int n,a[N],b[N],c[N];
int ans;
int Main()
{
    scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	for(int i=n;i>=max(1,n-200);i--){
		int num=0;
		for(int j=i+1;j<=n;j++)
			b[++num]=a[j]%a[i];
		sort(b+1,b+num+1);
		int now=1,len=0;
		for(int j=1;j<i;j++){
			while(now<=num&&a[j]>b[now]) c[++len]=b[now],now++;
			c[++len]=a[j]; 
		}
		while(now<=num) c[++len]=b[now],now++;
		//cout<<i<<":";for(int j=1;j<=len;j++) cout<<c[j]<<' ';cout<<endl;
		ans=max(ans,(c[len]+c[len-1])%a[i]);
		int id=0;
		for(int j=len;j>=1;j--){
			while(id+1<j&&c[id+1]+c[j]<a[i]) id++;
			if(id) ans=max(ans,c[id]+c[j]);
		}
	} 
	printf("%d",ans);
	return 0;
}
int main()
{
    int Case=1;
    while(Case--) Main();
	return 0;
}

2024/11/11 19:34
加载中...