CF1470A Strange Birthday Party
https://codeforces.com/contest/1471/problem/C
以为是01背包的变形dp,转念一想你见过哪个01背包知道自己选了啥
想压缩吧,又发现这个n实在太大,没了
终于拐到贪心了
想说对每个礼物,让它发挥最大的价值,那么应该在能选的人中,挑一个不送礼代价最大的。
又开始纠结是否存在多个礼物对同一个人还是一个礼物对多个人。
又觉得出现多解的话都一样吧。
最后yy出来的算法是对序列c中当前的最大值,往前找到合法的最小值,然后一直到不能送。
一看题解:1<=c1<=c2<=c3<=c4,wrnm..
那还往前找个啥,直接首尾送就完事儿啊。我想的是针对无序情况的。
这个案件告诉我们好好看题有多重要。
以及好好睡觉有多重要(睡醒了以后想了一半的D题..)
sort后再贪心这个点见过,sort可以排除一些干扰。
#include<bits/stdc++.h>
using namespace std;
bool cmp(long long a,long long b)
{
return a>b;
}
long long t,n,m,c[400005],k[400005];
int main( )
{
//freopen("917.in","r",stdin);
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%lld",&k[i]);
}
for(int j=1;j<=m;j++)
{
scanf("%lld",&c[j]);
}
long long ans=0;
sort(k+1,k+1+n,cmp);
int use=1;
for(int i=1;i<=n;i++)
{
if(use<=m&&c[use]<c[k[i]])
{
ans+=c[use];
use++;
}
else ans+=c[k[i]];
}
cout<<ans<<endl;
}
}
可以把礼物看做对答案的优化,能送则送(也就是代码里写的c[use]<c[k[i]])。
记录弱到哭出来的我。

浙公网安备 33010602011771号