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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最高的奖励

發布時間:2023/12/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最高的奖励 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有N個任務,每個任務有一個最晚結束時間以及一個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每一個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有沖突,這需要你來取舍。求能夠獲得的最高獎勵。
Input
第1行:一個數N,表示任務的數量(2 <= N <= 50000)
第2 - N + 1行,每行2個數,中間用空格分隔,表示任務的最晚結束時間Eii以及對應的獎勵Wii。(1 <= Eii <= 10^9,1 <= Wii <= 10^9)
Output
輸出能夠獲得的最高獎勵。
Sample Input
7
4 20
2 60
4 70
3 40
1 30
4 50
6 10
Sample Output
230
這個題目一開始想錯了,那個時間我以為必須在那個時間點完成呢。然后這就簡單了。可是樣例都過不了。然后仔細讀了讀題,發現這是最后的時間,在這之前的任何一個時間完成就行了。這樣就用優先隊列解決就可以了。如果當前時間比隊列中的任何一個時間都大的話,這樣直接加入隊列就好了。如果不是的話,就和隊列中那個最小的比較,減去最小的就好了。
代碼如下:

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #define ll long long using namespace std;const int maxx=5e4+10; struct node{int time;int cost; }p[maxx]; bool cmp(const node &a,const node &b)//先對時間排序,時間小的排在前面。 {return a.time<b.time; } int n;int main() {while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d%d",&p[i].time,&p[i].cost);}sort(p,p+n,cmp);priority_queue<int,vector<int>,greater<int> > q;//優先隊列,小的在上面。ll sum=0;for(int i=0;i<n;i++){int cnt=p[i].cost;if(p[i].time>q.size()){sum+=cnt;q.push(cnt);}else{sum+=cnt;q.push(cnt);//先壓入隊列。sum-=q.top();//減去最小的那一個。q.pop();//將最小的去掉}}printf("%lld\n",sum);} }

對于優先隊列還不太熟悉,,,
努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的最高的奖励的全部內容,希望文章能夠幫你解決所遇到的問題。

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