nssl1142,jzoj3487-剑与魔法【堆,贪心】
生活随笔
收集整理的這篇文章主要介紹了
nssl1142,jzoj3487-剑与魔法【堆,贪心】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
紀中題目鏈接:https://jzoj.net/senior/#main/show/3487
題目大意
有兩個東西
一個是表示可以選擇這個東西,然后加x的價值。
一個是在這個操作之前不可以超過x個東西。
求最大價值
解題思路
我們考慮每個不能超過的操作,我們留下價值最大的。我們可以用這個思路,先將能裝的裝了,然后到達第二個操作就留下價值最大的。
我們可以用一個小根堆來計算,然后每個東西最多被丟一次,所以時間復雜度:O(nlog?n)O(nlogn)
code
#include<cstdio> #include<algorithm> #define N 200010 using namespace std; int cnt,x,num,a[N],ans; void up(int x)//維護堆 {while(x>1&&a[x/2]>a[x]){swap(a[x/2],a[x]);x/=2;} } void down(int x)//維護堆 {int y;while(x*2<=num&&a[x*2]<a[x]||x*2+1<=num&&a[x*2+1]<a[x]){y=x*2;if(y<num&&a[y]>a[y+1]) y++;swap(a[x],a[y]);x=y;} } int main() {scanf("%d",&cnt);for(int i=1;i<=cnt;i++){char ch=getchar();while (ch!='c'&&ch!='e') ch=getchar();scanf("%d",&x);if(ch=='c'){a[++num]=x;ans+=x;up(num);}//能裝就裝else if(i!=cnt){while(num>=x){ans-=a[1];swap(a[1],a[num]);num--;down(1);}//丟到允許}}printf("%d",ans); }總結
以上是生活随笔為你收集整理的nssl1142,jzoj3487-剑与魔法【堆,贪心】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nssl1141,jzoj3470-最短
- 下一篇: nssl1143,jzoj3493-三角