51nod 1163 最高的獎勵 貪心 雜類

2021-07-27 17:18:07 字數 2417 閱讀 8076

題目連線:

———————————————————————————————–.

1163 最高的獎勵

基準時間限制:1 秒 空間限制:131072 kb 分值: 20 難度:3級演算法題 收藏 關注

有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

————————————————————————————————.

解題思路:

本題看別人的思路都是貪心+優先佇列

按照題意,可以從最晚結束時間和完成任務獎勵分別展開求解。

從最晚結束時間考慮貪心策略的話,那麼應該將最晚結束時間公升序排序。

具體(ps):

用貪心思想,從0開始,每完成一件任務,消耗時間為1,按最晚時間遞增,第n個任務如果最晚時間大於已消耗掉時間量,則可算入總和,若不大於已耗時間量,

則可以替換掉總和裡最小獎勵的乙個任務(如果當前任務的獎勵更多的話)。

這個過程可以用堆維護。nlog(n);

然而我是貪心+雙陣列

定義h陣列,表示hi

時刻內做沒有做任務

定義m陣列,表示乙個」指標」,指向距離mi

時間點最近的沒有做任務的時間點(m

i≤i)

。其實這一步有點像並查集

排序的時候以w遞減,e沒什麼所謂。

然後一次遍歷,判斷這個任務能不能做,能做就計算上。

排序是o(n

log(n)

) 的,在統計的時候確實o(

n)的貪心+優先佇列

————————————————————————————————.

#include"stdio.h"  

#include"algorithm"

#include"queue"

using

namespace

std;

const

int maxn=5e4+5;

struct taskt[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;iint k=t[i].cost;

if(t[i].times>pq.size()) 這裡理解代表時間點

else

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

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

return

0;

}

貪心+加上雙陣列

————————————————————————————————.

struct node a[n];

bool cmp(node a,node b)

intm[n]; //指標,指向距離當前時間點最近的沒有做任務的時間點。

bool h[n]; //判斷當前時間點有沒有做任務。

int main()

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

ll ans = 0;

//lalal;

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

if(now<0)now=0;

m[a[i].e]=now;

if(!h[m[a[i].e]])

//for(int i=1;i<=n;i++) printf("%d

%c",h[i],(i==n)?'\n':' ');

//for(int i=1;i<=n;i++) printf("%d

%c",m[i],(i==n)?'\n':' ');

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

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