1163】最高的獎勵 (貪心+優先佇列 或 妙用並查集)
阿新 • • 發佈:2018-12-15
題幹:
有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
解題報告:
爛大街的優先佇列貪心就不再贅述了、、、這題偶然發現可以並查集你敢信,,,
AC程式碼:
#include<bits/stdc++.h> #define ll long long #define fi first #define se second using namespace std; const int MAX = 50000 + 5; ll f[MAX]; pair <ll,ll> p[MAX]; int find(int x){ if(x<=0) return -1; if(x==f[x]) return f[x]=x-1; else return f[x] = find(f[x]); } int main() { ll n,sum=0; cin>>n; for(int i = 1; i<=n; i++){ f[i]=i; scanf("%d%d",&p[i].se,&p[i].fi); p[i].fi=-p[i].fi; } sort(p+1,p+n+1); for(int i = 1; i<=n; i++){ if(find(p[i].se)>=0) sum += (-p[i].fi); } printf("%lld\n",sum); return 0; }