51 nod 最高的獎勵

2021-07-12 05:16:38 字數 1258 閱讀 5915

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

input

第1行:乙個數n,表示任務的數量(2 <= n <= 50000)

第2 - n + 1行,每行2個數,中間用空格分隔,表示任務的最晚結束時間e[i]以及對應的獎勵w[i]。(1 <= e[i] <= 10^9,1 <= w[i] <= 10^9)

output

輸出能夠獲得的最高獎勵。
input示例

7

4 20

2 60

4 70

3 40

1 30

4 50

6 10

output示例

230

分析一下這個題哈,首先每乙個單位時間只能做一件事情,對於樣例來說,我們其實就是考慮結束時間為4的三種情況我們怎麼取而已吧。

你會發現,我們考慮4的情況,我們只會去和結束時間為1,2,3,的來討論,對於結束時間是6的,我們是不會管的,所以6我們是一定會取的。因為在那個時間

沒有事情會和它衝突。

所有我們就應該倒著來討論。

因為這個最大的時間是10^9次方,太大了,我們可以把這個時間縮小,縮小到n就可以了,大於n的就讓他直接等於n,這樣考慮是不會影響最終的結果的。

因為最多就是n件事情,每個乙個單位時間。

然後我們就倒著找,當時間為n的時候,把所有時間為n的找出來,取乙個最大值加起來,怎麼快速取到最大?

優先佇列。就可以咯。

#includeusing namespace std;

struct node

} a[50005];

bool cmp(node aa,node bb)

int main()

sort(a+1,a+n+1,cmp);

// for(int i=1;i<=n;i++)

// printf("%d %d\n",a[i].e,a[i].c);

int j=1;

long long ans=0;

for(int i=n;i>=1;i--)

if(!q.empty())

{node temp=q.top();

ans+=temp.c;

cout<

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行 乙個數...