51Nod 1163 最高的獎勵

2021-07-16 07:55:19 字數 1640 閱讀 4536

acm模版

這是一道十分不錯的貪心問題,有o(nlogn)o(n*α(n))解法。

oneo(nlogn)演算法:

將最晚結束時間公升序排序,第n個任務最晚時間如果大於已經消耗的時間,則可以算入總和,若不大於可以嘗試替換掉已經算入總和中的最小獎勵的任務,條件是這件任務的獎勵要大於要替換掉的任務的獎勵。使用優先佇列維護。

twoo(n*α(n))演算法:

將任務獎勵從大到小排序,然後遍歷,如果有可完成任務的時間,則完成此任務,獎勵算入總和即可。這裡的可完成任務的時間用並查集維護即可,f[x]=t;表示最晚完成時間為x的任務可以在t時刻完成,初始化為f[x]=x;

one:

#include 

#include

#include

#include

typedef

long

long ll;

using

namespace

std;

const

int maxn = 5e4 + 10;

struct task

t[maxn];

bool cmp(const task a,const task b)

int main()

sort(t, t + n, cmp);

// 優先佇列維護

priority_queue

, greater > pq;

long

long ans = 0;

for (int i = 0; i < n; i++)

else

// 時間點有衝突,把cost最小刪除

}printf("%lld\n", ans);

return

0;}

two:

#include 

#include

#include

#include

using

namespace

std;

const

int maxn = 5e4 + 5;

struct task

task[maxn];

// 使用並查集

int f[maxn]; // f[i] = j:最晚結束時間i可以在j時間完成

bool cmp(const task a, const task b)

int find(int x)

if (f[x] == x)

else

}int main()

sort(task, task + n, cmp);

long

long ans = 0;

for (int i = 0; i < n; i++)

}printf("%lld\n", ans);

return

0;}

51NOD 1163 最高的獎勵

這個題 自己想了想 mmp 感覺一做貪心題只會用 sort 忽略了 優先佇列 這題搜了題解後 大概明白了 就是建立乙個最小堆 把cost 壓入最小堆 如果當前時間 q.size 說明可以直接加 如果小於等於 就要把cost 壓入後 取乙個最小的出來 挺好的乙個題 include using name...

最高的獎勵 51Nod 1163

最高的獎勵 51nod 1163 有n個任務,每個任務有乙個最晚結束時間以及乙個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每乙個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有衝突,這需要你來取捨。求能夠獲得的最高獎勵。input 第1行 乙個數...

51nod 1163 最高的獎勵

1163 最高的獎勵 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有n個任務,每個任務有乙個最晚結束時間以及乙個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每乙個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會...