萌新,求调非可反悔贪心,wa#4
查看原帖
萌新,求调非可反悔贪心,wa#4
362309
tigerhan7楼主2023/11/13 21:52

用的第一篇题解的思想

//魔改贪心,还以为要可反悔,看起来很麻烦要5个。
//但实际上,你可以用一个魔改的? 
//即用两个堆,一个堆保存拿一个星的代价,另一个堆保存拿两个星的,然后比较a1+a2与b1的代价即可,然后就保存一下有没有玩过某个关卡。
#include<bits/stdc++.h>
#define int long long  
using namespace std;
int n,m;
int a[600001],b[600001],vis[600001],star[600001];
struct node
{
	int num,id;
	friend bool operator < (const node &x,const node &y)
	{
		return x.num > y.num;
	};
};priority_queue<node> q1,q2;
void clean(priority_queue<node> &q)
{
	while(q.size()&&vis[q.top().id]) q.pop(); 
	return ;
}
signed main()
{
	memset(vis,0,sizeof(vis));
	scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i],&a[i+n]);
	for(int i=1;i<=n;i++) q1.push({a[i],i}),q2.push({a[i+n],i+n});
	int ans=0;while(m)
	{	
		clean(q1),clean(q2);node e=q1.top();q1.pop();clean(q1);int pd=1;
		if(m>=2&&q1.size()&&q2.size()&&e.num+q1.top().num>=q2.top().num) q1.push(e),e=q2.top(),q2.pop(),pd=2;//clean(q1);clean(q2);
		if(pd==1) 
		{
			ans+=e.num;vis[e.id]=1;//printf("**%d %d\n",e.num,e.id);
			if(e.id<=n) q1.push({a[e.id+n]-a[e.id+n],e.id+n});
		}
		else 
		{
			ans+=a[e.id-n],q1.push({a[e.id]-a[e.id-n],e.id}),vis[e.id-n]=1;
		}
		m--;star[(e.id-1)%n+1]++;
	}printf("%lld\n",ans);
	for(int i=1;i<=n;i++) printf("%lld",star[i]);
	return 0;
}

这是结果:Wrong Answer.wrong answer Printed sequence corresponds to 2 time, but 1 found in the first line

感激不尽

2023/11/13 21:52
加载中...