题目
白桃是手游昨日方舟里新出的一个角色, 她的攻击力为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;
}