题解 | #追求女神#

集合操作

https://ac.nowcoder.com/acm/contest/11173/C

c题题解

思路

思路:使用优先队列 --> 大根堆 ,因为它会动态更新, 所以我们每次把里面的最大值也就是队头给减去p就行了
但是 因为一次一次的减去p,总共需要减去k次,k很大 会超时。
所以我们对于每一个取出的最大值 让他减去cnt次p。
cnt:减去cnt次p 后,该最大值 被 第二大的值 反超

但这样也有局限性,若我们得到的每个cnt都为1,最后还是需要执行k次减去p的操作。
比如 n个数均相同,我们会发现 每个cnt都是1。

但是 最后竟然过了,所以这题的数据还是挺水的ba。。。
综上:Code如下。

Code

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

typedef long long ll;

const int N=1e6+10;

priority_queue<ll,vector<ll> > heap; //大根堆
ll a[N];
ll n,k,p;

int main(){
    cin>>n>>k>>p;
    for(int i=0;i<n;i++){
        ll x;
        cin>>x;
        heap.push(x);
    }

    if(p!=0){
        while(k){
         auto t=heap.top();
          heap.pop();
          ll cnt=(t-heap.top())/p+1;  //最大的减去cnt次后 会不再是最大数(变得小于第二大) 
          t-=cnt*p;
          k-=cnt;
          heap.push(t);
        }
    }


    int t=0;
    while(heap.size()){
        auto x=heap.top();
        a[t++]=x;
        heap.pop();
    } 

    for(int i=t-1;i>=0;i--){
        if(i==t-1) cout<<a[i];
        else cout<<" "<<a[i];
    }
    puts("");

    return 0;
}
全部评论
啊这,数据太水了吧。。。
点赞 回复 分享
发布于 2021-05-23 15:58

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务