贪心选择价值大保质期短的,选择最晚的一天
#include<cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;
#define fst first
#define sec second
#define sci(num) scanf("%d",&num)
#define scl(num) scanf("%lld",&num)
#define mem(a,b) memset(a,b,sizeof a)
#define cpy(a,b) memcopy(a,b,sizeof b)
typedef long long LL;
typedef pair<int,int> P;
const int MAX_N = 10010;
const int MAX_M = 10000;
int Fa[MAX_N],N;
P ps[MAX_N];
bool cmp(const P& p1,const P& p2) {
if (p1.first == p2.first) return p1.second < p2.second;
return p1.first > p2.first;
}
void init() {
for (int i = 0;i < MAX_N;i++) {
Fa[i] = i;
}
}
int Find(int x) {
if (Fa[x] != x) {
Fa[x] = Find(Fa[x]);
}
return Fa[x];
}
int main() {
while (~sci(N)) {
init();
int ans = 0;
for (int i = 0;i < N;i++)
{
sci(ps[i].first); sci(ps[i].second);
}
sort(ps,ps + N,cmp);
for (int i =0;i < N;i++) {
int t = Find(ps[i].second);
if(Fa[t] != 0) {
ans += ps[i].first;
Fa[t] = t - 1;
}
}
printf("%d\n",ans);
}
return 0;
}