贪心 141ms
</pre><ul style="font-family: -webkit-standard;"><pre class="sh_cpp sh_sourceCode" style="background-color: white; font-family: 'Courier New', Courier, monospace;"><pre name="code" class="cpp">//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/7/24.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000+100;
struct node{
int p,d;
bool operator < (struct node s) const {
return p>s.p;
}
}node[maxn];
int use[maxn];
int main()
{
int n,ans,sum;
while(scanf("%d",&n)!=EOF)
{
ans=0;sum=0;
for(int i=1;i<=n;i++) scanf("%d%d",&node[i].p,&node[i].d);
sort(node+1,node+n+1);
memset(use,0,sizeof(use));
for(int i=1;i<=n;i++)
{
int p=node[i].p;
int d=node[i].d;
ans=max(ans,d);
for(int j=d;j>=1;j--)
{
if(p>use[j]) {use[j]=p;break;}
}
}
for(int i=1;i<=ans;i++) sum+=use[i];
cout<<sum<<endl;
}
}
并查集 63ms
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/7/24.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000+10;
int pa[maxn];
struct node{
int p,d;
}node[maxn];
bool cmp(struct node a,struct node b) {return a.p>b.p;}
int getroot(int a)
{
if(pa[a]==-1) return a;
return pa[a]=getroot(pa[a]);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int ans=0;
memset(pa,-1,sizeof(pa));
for(int i=1;i<=n;i++) scanf("%d%d",&node[i].p,&node[i].d);
sort(node+1,node+n+1,cmp);
for(int i=1;i<=n;i++)
{
int l=getroot(node[i].d);
if(l>0)
{
ans+=node[i].p;
pa[l]=l-1;
}
}
printf("%d\n",ans);
}
return 0;
}