日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nssl1142,jzoj3487-剑与魔法【堆,贪心】

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-剑与魔法【堆,贪心】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。