用的第一篇题解的思想
//魔改贪心,还以为要可反悔,看起来很麻烦要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
感激不尽