蒟蒻把绿题写炸了,求调
大体思路是将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;
}