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]])。

       记录弱到哭出来的我。

posted @ 2021-09-17 18:31  liyishui  阅读(53)  评论(0)    收藏  举报