第一篇正儿八经的题解
先看题目描述
发现本题主要解决以下问题
给出一个数列,在单位一的时间内可同时做以下操作
·对所有的数减A
·对指定数减B
求出最少的操作次数使这个数列的所有数均<=0
不难发现这是一道简单的贪心题
每次操作只需将上一次操作后产生的最大的数减B,其余数均减A即可
然而这并不是一道模拟题,如果只简单地地模拟上述策略是一定会TLE的
经过再次读题发现
·对所有的数减A
此操作操作是每一次都会在每一个数上进行的单调操作
我们便可以将此操作统一存在一个变量上供所有数使用
顺便用一下堆优化
分析完成,开始打代码
#include <bits/stdc++.h>
using namespace std;
priority_queue<int> a; //本题需要大根堆,优先队列默认大根堆
int t=0;
int k,n,A,B,m;
int sum=0;
int main(){
cin>>n>>A>>B;
for(int i=1;i<=n;i++){
cin>>m;
a.push(m);
}
while(true){
k=a.top();
if(k-sum<=0)
{
cout<<t;
return 0;
}
a.pop();
sum+=A;
a.push(k-B);
t++;
}
return 0;
}
华丽的结尾