生活随笔
收集整理的這篇文章主要介紹了
最高的奖励
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有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)/~
總結
以上是生活随笔為你收集整理的最高的奖励的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。