Supermarket
https://cn.vjudge.net/contest/283640#problem/G
题目大意:
超市里有n个产品要卖,每个产品都有一个截至时间dx(开始时间是1),只有在这个截至时间及或其之前才能卖出并且获得率润dy。有多个产品,每卖一个产品要占用1个单位的时间,一个单位时间只能卖一件产品,问最多能卖出多少利润。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int date, pri;
} a[10020];
int pre[10020];//表示第i个时间点的占用状态,-1表示未被占用
int root(int x)
{
if(pre[x] == -1)
return x;
return pre[x] = root(pre[x]);
}
bool cmp(node a, node b)
{
return a.pri > b.pri;
}
int main()
{
int i,n,t,ans;
while(~scanf("%d",&n))
{
memset(pre,-1,sizeof(pre));
for(i = 0; i < n; i ++)
{
scanf("%d %d",&a[i].pri,&a[i].date);
}
sort(a,a+n,cmp);//按照价值从大到小排序
ans = 0;
for(i = 0; i < n; i ++)
{
t = root(a[i].date);
if(t > 0)//
{
ans += a[i].pri;
pre[t] = t-1;//t的下一个合法时间点要从t-1开始找
}
}
printf("%d\n",ans);
}
return 0;
}