题意:
是买卖N件东西,每件东西都有个截止时间,在截止时间之前买都可以,而每个单位时间只能买一件。问最大获利。
思路:
用贪心做,用并查集来加快速度,太精妙了。
如果购买不冲突,那么全部买下来就可以了。存在冲突,就需要取舍。显然在冲突的时候我们选择价格高的更优,如此就可以用贪心的算法。先将物品按照价格从高到底的顺序排列,购买一个就在时间点上做一个标记,只要不冲突就可以购买。 如何快速找到第一个不冲突的时间点呢,使用并查集很好得解决了这个问题。 这里并查集的作用类似于链表指针,压缩的过程就是删掉节点的过程。从而在O(1)的时间内找到那个不冲突的点。
code:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=10010;
int F[maxn];
truct Node
{
int p,d;
}node[MAXN];
bool cmp(Node a,Node b)
{
return a.p>b.p;
}
int find(int x)
{
if(F[x]==-1)return x;
return F[x]=find(F[x]);
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
memset(F,-1,sizeof(F));
for(int i=0;i<n;i++)
scanf("%d%d",&node[i].p,&node[i].d);
sort(node,node+n,cmp);
int ans=0;
for(int i=0;i<n;i++)
{
int t=find(node[i].d);
if(t>0)
{
ans+=node[i].p;
F[t]=t-1;
}
}
printf("%d\n",ans);
}
return 0;
}