CF1415E New Game Plus(贪心)
生活随笔
收集整理的這篇文章主要介紹了
CF1415E New Game Plus(贪心)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
解析
把題目標簽寫在數(shù)據(jù)范圍上的一道題
由于k過大,顯然無法dp
那就只能貪了
一開始被完全帶跑偏了…
想的是把序列降序排列然后從后往前劃分…
這個思路能很簡單的寫出nkdp
然后就卡住了…
算看了一半題解吧
看到第一段“考慮分成k組”后退出來了
有了這個線頭后面就非常順
以后還是要努力培養(yǎng)在推不出好的性質(zhì)時打破第一印象的能力
考慮正解
清零k次等價于把boss分成不多于k組
每次把新元素加入的同時獲得原來集合內(nèi)元素和的代價
所以只需要維護集合的元素和即可
考慮把所有集合放入大根堆
降序加入元素
顯然正的元素直接全放一組是最好的
如果現(xiàn)在是負的元素
如果堆頂還是正的那就加進去,不難發(fā)現(xiàn),因為后面的元素更小,這樣能盡可能讓這個集合發(fā)揮余熱(性感理解一下),肯定還是好的
如果堆頂負了我們就盡可能的讓新元素成為一個新的集合
感性理解一下,在啥都是負的時候,我們肯定是讓所有的元素從大到小蛇形分布,這樣使產(chǎn)生貢獻的元素都是相對負的不厲害的
如果極小值全塞到一起肯定是不好的
(為什么我的貪心分析全是感性理解啊qwq)
代碼
#include<bits/stdc++.h> const int N=1e6+100; const int mod=1e9+7; #define ll long long using namespace std; inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m; ll a[N],ans; bool cmp(ll x,ll y){return x>y; } priority_queue<ll>q; int main(){n=read();m=read();++m;for(int i=1;i<=n;i++) a[i]=read();sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){ll x=a[i];if(q.empty()||(q.top()<0&&(signed)q.size()<m)){q.push(x);}else{ll o=q.top();q.pop();ans+=o;o+=x;q.push(o);}}printf("%lld\n",ans); } /* 1 281239 */總結
以上是生活随笔為你收集整理的CF1415E New Game Plus(贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《炉石传说》更新 28.0 补丁,暴雪已
- 下一篇: P3642 [APIO2016]烟火表演