luogu P1843奶牛晒衣服

第一篇正儿八经的题解


先看题目描述

发现本题主要解决以下问题

给出一个数列,在单位一的时间内可同时做以下操作

·对所有的数减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;
}

华丽的结尾

猜你喜欢

转载自www.cnblogs.com/XJack/p/10831293.html