为什么这样贪心是错的
查看原帖
为什么这样贪心是错的
242317
xiaofu15191楼主2025/1/24 11:43

RT,用优先队列维护对于每一个 aia_i,可以减去的最大值。

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
long long n,num[100010],b[11],m,k,ans;
priority_queue<pair<long long,long long>>q;
int main()
{
	long long T;
	scanf("%lld",&T);
	while(T--)
	{
		ans=0;
		scanf("%lld%lld%lld",&n,&m,&k);
		for(long long i=1;i<=n;i++)
			scanf("%lld",&num[i]),ans+=num[i];
		while(!q.empty()) q.pop();
		for(long long i=1;i<=m;i++)
			scanf("%lld",&b[i]);
		for(long long i=1;i<=n;i++)
		{
			auto tmp=make_pair(0ll,0ll);
			for(long long j=1;j<=m;j++)
			{
				auto tmp2=make_pair(num[i]-(num[i]&b[j]),i);
				if(tmp2.first>tmp.first) tmp=tmp2;
			}
			q.push(tmp);
		}
		for(long long i=1;i<=k;i++)
		{
			auto head=q.top();
			q.pop();
			ans-=head.first;
			num[head.second]-=head.first;
			auto tmp=make_pair(0ll,head.second);
			for(long long j=1;j<=m;j++)
			{
				auto tmp2=make_pair(num[head.second]-(num[head.second]&b[j]),head.second);
				if(tmp2.first>tmp.first) tmp=tmp2;
			}
			q.push(tmp);
		}
		printf("%lld\n",ans);
	}
}
2025/1/24 11:43
加载中...