求助,为什么一直wa,按进阶指南上说的写的
查看原帖
求助,为什么一直wa,按进阶指南上说的写的
138106
tgs9311楼主2022/2/28 19:50
#include<bits/stdc++.h>
using namespace std;
namespace FAST_IO
{
	template<typename T> void read(T &a)
	{
		a=0;
		int f=1;
		char c=getchar();
		while(!isdigit(c))
		{
			if(c=='-')
			{
				f=-1;
			}
			c=getchar();
		}
		while(isdigit(c))
		{
			a=a*10+c-'0';
			c=getchar();
		}
		a=a*f;
	}
	template <typename T> void write(T a)
	{
		if(a<0)
		{
			a=-a;
			putchar('-');
		}
		if(a>9)
		{
			write(a/10);
		}
		putchar(a%10+'0');
	}
	template <typename T> void writeln(T a)
	{
		write(a);
		puts("");
	}
}
const int maxn=205,maxm=23,delta=450;
int dp[maxn][maxm][delta*2+50],zy[maxn][maxm][delta*2+50][3];//前i个人,选了j个,delta为k是否能xing7 
int n,m,a[maxn],b[maxn];
int ans=INT_MAX,pos,sumdp;
int chose[maxm],chosezz,qzz;
int main()
{
	while(cin>>n>>m)
	{
		qzz++;
		if(!n&&!m)
		{
			return 0;
		}
		for(int i=1;i<=n;i++)
		{
			cin>>a[i]>>b[i];
		}
		chosezz=0;
		memset(dp,0,sizeof(dp));
		memset(zy,0,sizeof(zy));
		memset(chose,0,sizeof(chose));
		sumdp=0;
		pos=0;
		ans=INT_MAX;
		
		for(int i=0;i<=n;i++)
		{
			dp[i][0][delta]=1;
		}
		//dp[0][0][delta]=1;//d+p+1
		//system("pause");
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				for(int k=0;k<=2*delta;k++)
				{
					int d=a[i]-b[i];
					if(k+d>=0&&k+d<=2*delta&&dp[i-1][j-1][k])
					{
						if(dp[i-1][j-1][k]+a[i]+b[i]>dp[i][j][k+d])
						{
							dp[i][j][k+d]=dp[i-1][j-1][k]+a[i]+b[i];
							zy[i][j][k+d][0]=i-1;
							zy[i][j][k+d][1]=j-1;
							zy[i][j][k+d][2]=k;
						}
					}
					if(dp[i-1][j][k]>dp[i][j][k]&&dp[i-1][j][k])
					{
						dp[i][j][k]=dp[i-1][j][k];
						zy[i][j][k][0]=i-1;
						zy[i][j][k][1]=j;
						zy[i][j][k][2]=k;						
					}				
				}				
			}
		}
		for(int j=0;j<=2*delta;j++)
		{
			if(dp[n][m][j])
			{
				//cout<<j-delta<<endl;
				if(abs(j-delta)<ans)
				{
					ans=abs(j-delta);
					sumdp=dp[n][m][j]-1;
					pos=j;			
				}
				else if(abs(j-delta)==ans&&dp[n][m][j]>sumdp)
				{
					sumdp=dp[n][m][j]-1;
					pos=j;
				}
				//cout<<dp[n][m][j]-1<<endl;
			}		
		}
		//cout<<m<<endl;
		int p,d;
		d=(sumdp-(pos-delta))/2;
		p=sumdp-d;
		cout<<"Jury #"<<qzz<<endl;
		cout<<"Best jury has value "<<p<<" for prosecution and value "<<d<<" for defence:"<<endl;
		int nown,nowm,nowpos;
		nown=n,nowm=m,nowpos=pos;
		while(nowm)
		{
		//	cout<<nown<<" "<<nowm<<" "<<nowpos<<endl;
			//cout<<zy[nown][nowm][nowpos][1]<<" "<<nowm<<endl;
			if(zy[nown][nowm][nowpos][1]<nowm||nowpos==0)
			{
				//cout<<nown<<endl;
				chosezz++;
				chose[chosezz]=nown;
			}
			//cout<<zy[nown][nowm][nowpos][1]<<" "<<nowm<<endl;
			int tmpnown=nown,tmpnowm=nowm,tmpnowpos=nowpos;
			nown=zy[tmpnown][tmpnowm][tmpnowpos][0];
			nowm=zy[tmpnown][tmpnowm][tmpnowpos][1];
			nowpos=zy[tmpnown][tmpnowm][tmpnowpos][2];
			//
			//cout<<nown<<" "<<nowm<<" "<<nowpos<<endl;
		}
		//cout<<ans<<" "<<dp[n][m][pos]-1<<endl;
		sort(chose+1,chose+m+1);
		for(int i=1;i<=m;i++)
		{
			cout<<chose[i]<<" ";
		}
		cout<<endl;
		cout<<endl;
	}
}
2022/2/28 19:50
加载中...