Supermarket
题目链接:Click Here~
题目分析:
一个商店里有N个商品,而每个商品都有他自己最晚售出的时间和利润,商品只有在规定的时间内售出,才能得到他的利润。要求你求出最大的利润。
算法分析:
一开始的时候虽然想到了贪心,但是没想到这也可以和并查集挂上勾,orz。就是用贪心的思想加上并查集的查找判定就可以了,太神奇了!但是还有一个问题,怎么用并查集判断呢?哈哈,这里就有一个技巧了。我们可以记录每一个时间是否使用过,如果该点时间使用过,这我们把他的父亲指向下一个时间点。则下一次查找的时间就可以直接找到了。而我们用了贪心的思想又可以保证了在同一时间点拿最大的物品价值,所以最后的结果当然会是最优的。
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1e4 + 5;
struct Node{
int time,price;
bool operator <(const Node &rhx)const{
return price != rhx.price?price > rhx.price:time < rhx.time;
}
}node[MAXN];
int f[MAXN];
int Find(int x)
{
if(f[x]==-1)
return x;
return f[x] = Find(f[x]);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(f,-1,sizeof(f));
for(int i = 0;i < n;++i)
scanf("%d%d",&node[i].price,&node[i].time);
sort(node,node+n);
int sum = 0;
for(int i = 0;i < n;++i){
int a = Find(node[i].time);
if(a!=0){
f[a] = a-1;
sum += node[i].price;
}
}
printf("%d\n",sum);
}
return 0;
}