1. 程式人生 > >1163】最高的獎勵 (貪心+優先佇列 或 妙用並查集)

1163】最高的獎勵 (貪心+優先佇列 或 妙用並查集)

題幹:

有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;
}