题目描述
有一个商店有许多批货,每一批货又有N(0<=N<=10^4104 )个商品,同时每一样商品都有收益P_iPi ,和过期时间D_iDi (1<=Pi,DiPi,Di <=10^4104 ),一旦超过了过期时间,商品就不能再卖。
你要做的就是求出每批货最多能得到多少收益。
输入输出格式
输入格式
多组数据,每组先给出一个整数N,表示这批货的商品个数。
然后有N对数,每对数有两个用空格隔开的正整数P_i,D_iPi,Di ,表示第i个商品的收益和过期时间。相邻两对数之间用空格隔开。
输入以一个文件终止符结束,并且保证所有输入数据正确。
输出格式
对于每组数据,输出一行一个整数表示该批货物能卖出的最大价格。
输入样例#1:
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
输出样例#1:
80
185
CODE
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 100000
using namespace std;
int re[N];
int ans;
int n;
struct node
{
int v;///value
int d;///day
}s[N];
inline bool cmp(node a,node b)
{
return a.v>b.v;
}
inline int find(int a)
{
if(re[a]==a)return a;
re[a]=find(re[a]);
return re[a];
}
int main()
{
while(scanf("%d",&n)==1)
{
for(int i=0;i<N;i++)
re[i]=-1;
for(int i=1;i<=n;i++)
scanf("%d%d",&s[i].v,&s[i].d);
sort(s+1,s+1+n,cmp);
ans=0;
for(int i=1;i<=n;i++)
{
int x=find(s[i].d);
if(x)
{
re[x]=x-1;
ans+=s[i].v;
}
}
printf("%d\n",ans);
}
return 0;
}