CodeForces - 994B Knights of a Polygonal Table

题目大意:

输入n,k,n表示n个骑士,k表示每个骑士杀的骑士不超过k,且只能杀死力量比自己小的(题目要求每个骑士的力量都不一样),每个骑士都有自己的硬币Ci

分析:

做这题时一开始有点思路,但是bug调了好久,主要还是思路不够清晰。
我们先将骑士的力量按从小到大排序,那么在骑士前面的骑士都可以被其杀死,然后只要杀掉前面的骑士中拥有前k大的硬币的骑士,若小于k个骑士,那么全部都干掉。
如何获得前k大的硬币呢,可以利用一个从小到大排列的优先队列,里面存的就是比当前骑士力量小,前k大的硬币。因此它的大小不会超过k,若要超过k,说明要入队的比这k个中最小的大,故就把k个中最小的一个弹出,然后入队

具体看代码:
#include <bits/stdc++.h>

using namespace std;
const int N=1e5+10;
#define ll long long 

ll p[N];
ll c[N];
ll num[N];
ll kill[N];

bool cmp(ll a, ll b)
{
	
	return p[a]<p[b];
}

priority_queue<ll, vector<ll> , greater<ll> > euq;
int main()
{
	
	ll n, k;
	while(~scanf("%lld%lld",&n,&k))
	{
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&p[i]);
			num[i]=i;
		}
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&c[i]);
		}
		sort(num+1,num+n+1,cmp);
		while(!euq.empty())
			euq.pop();
		
		ll ans=0;
		for(int i=1;i<=n;i++)// 遍历num
		{
			kill[num[i]]=c[num[i]]+ans;
			
			if(k>0)
			{
				
				if(euq.size()==k)
				{
					if(c[num[i]]>euq.top())
					{
						ans+=c[num[i]]-euq.top();
						euq.pop();
						euq.push(c[num[i]]);
					}
				}
				else
				{
					ans+=c[num[i]];
					euq.push(c[num[i]]);
				
					
				}
			}
					
			
		}
		
		for(int i=1;i<=n;i++)
		{
			printf("%lld ",kill[i]);
		}
		printf("\n");
		
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值