0pts求调
查看原帖
0pts求调
801226
Heart_Beating楼主2023/10/15 20:00

蒟蒻把绿题写炸了,求调

大体思路是将rank下降的代价记为0,将rank不变的代价记为1,将rank上升的代价记为2,然后跑一个要求装满的容量为n的01背包,但我太弱了不会写

#include<bits/stdc++.h>
using namespace std;
long long t,n,Inf=10000000000000000;
struct node
{
	long long score;
	long long devote;
};
bool operator<(node a,node b)
{
	return a.score<b.score; 
};
node a[200005];
long long dp[200005];
int main()
{
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	//freopen("1.txt","w",stdout);
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=0;i<=n;i++)
		{
			dp[i]=-Inf;
		}
		for(int i=1;i<=n;i++)
		{
			cin>>a[i].score;
		}
		for(int i=1;i<=n;i++)
		{
			cin>>a[i].devote;
		}
		sort(a+1,a+n+1);
//		for(int i=0;i<=n;i++)
//		{
//			cout<<dp[i]<<' ';
//		}
//		cout<<endl;
		dp[0]=0;
		dp[1]=0;
		dp[2]=a[1].devote;
		for(int i=2;i<=n;i++)
		{
			for(int j=n;j>=0;j--)
			{
				dp[j]-=a[i].devote;
				if(j>=1)
				{
					dp[j]=max(dp[j],dp[j-1]); 
				}
				if(j>=2 && j!=n)
				{
					dp[j]=max(dp[j],dp[j-2]+a[i].devote);
				}
			}
			for(int j=0;j<=n;j++)
			{
				cout<<dp[j]<<' ';
			}
			cout<<endl; 
		}
//		cout<<dp[n]<<'\n';
	}
	return 0; 
}
2023/10/15 20:00
加载中...