1163 最高的獎勵
基準時間限制:1 秒 空間限制:131072 kb 分值: 20 難度:3級演算法題
有n個任務,每個任務有乙個最晚結束時間以及乙個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每乙個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有衝突,這需要你來取捨。求能夠獲得的最高獎勵。
input
第1行:乙個數n,表示任務的數量(2 <= n <= 50000)output第2 - n + 1行,每行2個數,中間用空格分隔,表示任務的最晚結束時間e[i]以及對應的獎勵w[i]。(1 <= e[i] <= 10^9,1 <= w[i] <= 10^9)
輸出能夠獲得的最高獎勵。input示例
7output示例4 20
2 60
4 70
3 40
1 30
4 50
6 10
230看a出來的人挺多的,就過來a這道題。。。。沒想到卡著了,容器不熟悉,果然要吃大虧的.....一直在想怎麼能讓時間確定的情況下選最大的的和。。。怎麼排序都不行因為它不是乙個動態的,在網上一看...優先佇列woc..........原來是這樣
#include#include#include#include#include#define maxn 50005
#define ll long long
using namespace std;
struct node
ac[maxn];
bool cmp(node a,node b)
sort(ac,ac+n,cmp);
ll ans=0;
priority_queue,greater >que;
for(int i=0;ique.size())
else
}cout優先佇列寫出來了,在網上看別人的**終於找到乙個不用優先佇列的,emmmm她竟然用了並查集,而且是我想用的之前一直沒想通的先排質量,然後不斷的更新,,真的厲害了。
#include#include#include#include#include#define maxn 50005
#define ll long long
using namespace std;
struct node
ac[maxn];
int par[maxn]; //最晚i秒的事情可在j秒完成
bool cmp(node a,node b)
int find(int x)
else return par[x]=find(par[x]);//路徑壓縮
}int main()
sort(ac,ac+n,cmp);
ll ans=0;
for(int i=0;i=0)
}cout<
return 0;
}
51Nod 1163 最高的獎勵
acm模版 這是一道十分不錯的貪心問題,有o nlogn 和o n n 解法。oneo nlogn 演算法 將最晚結束時間公升序排序,第n個任務最晚時間如果大於已經消耗的時間,則可以算入總和,若不大於可以嘗試替換掉已經算入總和中的最小獎勵的任務,條件是這件任務的獎勵要大於要替換掉的任務的獎勵。使用優...
51NOD 1163 最高的獎勵
這個題 自己想了想 mmp 感覺一做貪心題只會用 sort 忽略了 優先佇列 這題搜了題解後 大概明白了 就是建立乙個最小堆 把cost 壓入最小堆 如果當前時間 q.size 說明可以直接加 如果小於等於 就要把cost 壓入後 取乙個最小的出來 挺好的乙個題 include using name...
最高的獎勵 51Nod 1163
最高的獎勵 51nod 1163 有n個任務,每個任務有乙個最晚結束時間以及乙個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每乙個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有衝突,這需要你來取捨。求能夠獲得的最高獎勵。input 第1行 乙個數...