乱搞求hack
查看原帖
乱搞求hack
712794
Azure_Space楼主2024/7/27 19:32

事情是这样的,我不会T2,然后猜测答案是带有一些条件限制的最大化若干元素的和,然后乱搞+调参花了半天才过。其实数据很强,只是我的乱搞过于离谱。

如果有人给出了hack希望能加到数据中

#include<bits/stdc++.h>
using namespace std;
int a[2006],dp[2006][40006],b[2006],t[4006];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	//int t;
	//cin>>t;
	//while(t--)
	//{for(int i=1;i<=20;i++) for(int j=5000-20;j<=5000+20;j++) dp[i][j]=0;
	int n;
	cin>>n;
	int js=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	if(n==1)
	{
		cout<<a[1];
		return 0;
	}
	int minn=1e9,maxn=-1e9;
	for(int i=1;i<=n;i++) minn=min(minn,a[i]),maxn=max(maxn,a[i]);
	if(minn>=0)
	{
		cout<<maxn;
		//continue;
		return 0;
	}
	if(maxn<=0)
	{
		int da=-1e9;
		for(int i=1;i<=n;i++) if(a[i]) da=max(da,a[i]);
		if(da==-1e9) cout<<'0';
		else cout<<da;
		//continue;
		return 0;
	}
	for(int i=1;i<=n;i++) t[a[i]+2000]++;
	n=0;
	for(int i=0;i<=4000;i++)
		for(int j=1;j<=min(t[i],500);j++)
		{
			a[++n]=i-2000;
		}
	for(int i=1;i<=n-1;i++) swap(a[i],a[rand()%(n-i)+1+i]);
	int jl;
	if(maxn>0)
	{
		for(int i=1;i<=n;i++)
		{
			if(a[i]==maxn)
			{
				jl=i;
				break;
			}
		}
		swap(a[jl],a[n]);
		n--;
	}
	dp[0][10000]=-1;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=20000;j++)
		{
			dp[i][j]=dp[i-1][j];
			if(0<=j-a[i]&&j-a[i]<=20000)
			{
				if(j==10000)
				{
					if(dp[i-1][j-a[i]]&&a[i]) dp[i][j]=1;
				}
				else dp[i][j]=(dp[i][j]||dp[i-1][j-a[i]]);
			}
		}
	}
	for(int i=20000;i>=0;i--)
	{
		if(maxn>0&&i>10000) continue;
		if(dp[n][i]==1)
		{
			if(maxn>0) cout<<i-10000+a[n+1];
			else cout<<i-10000;
			break;
		}
	}
	//}
	return 0;
}
/*
10
2000 2000 2000 2000 -1999 -1999 -1999 -1999 -10 2000
20
2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000
*/
2024/7/27 19:32
加载中...