干员测试(优先队列priority_queue)

题目

白桃是手游昨日方舟里新出的一个角色, 她的攻击力为x, 攻击范围为白桃正前方的mmm格, 每次攻击都可以攻击她攻击范围内的所有敌人,
但是她的每次攻击都会消耗一定的费用c,且敌人走到第一个格子后不会继续行走。

为了简化测试模型, 我们假设一共有n个敌人, 每个敌人的生命值为aia_iai​, 防御力为0,
即白桃每次攻击对敌人造成的伤害就是x。n个敌人依次排列, 且每个敌人独立的占据一个格子, 当敌人前方格子为空时, 敌人会前进,
无视敌人移动所花费的时间。

因为dmy今天的理智已经被榨干了, 他需要万能的你来帮助他算算白桃消灭所有敌人需要攻击多少次, 这方便他规划剩下的费用该怎么使用。

输入描述:

第一行输入三个数n, m, x, 分别表示敌人的数量, 白桃的攻击范围和白桃的攻击力.

第二行输入n个数, aia_iai​表示第i个敌人的生命值.

输出描述:

输出一个整数, 表示白桃的最少攻击多少次次数.

题意

n个数字,每次能减少最前面m个不为0的数字各x,问需要操作多少次才能将所有数字变为0

题解

维护一个大小为m的优先队列,每次只需将优先队列中最小的pop出队列,再将之后的数字push进队列即可。
在push进队列的时候只需加上当前已经操作了的次数,即可抵消之前操作的影响。当优先队列为空时,最后一个pop出队的即为答案。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100005];
priority_queue<ll,vector<ll>,greater<ll> >q;
int main()
{
	ll n,m,x;
	cin>>n>>m>>x;
	for(int i=1;i<=n;i++)
	{
		ll t;
		cin>>t;
		a[i]=(t+x-1)/x;
	}
	ll p=0;
	for(int i=1;i<=m;i++)//维护一个长度为m的优先队列
	{
		q.push(a[i]);
	}
	for(int i=m+1;i<=n;i++){//每次将最小的 也就是在前面的 前面的pop出去
		p=q.top();q.pop();
		q.push(a[i]+p);
	}
	while(!q.empty()){
		p=q.top();q.pop();
	}
	cout<<p<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值