版权声明:转载请注明原出处啦QAQ(虽然应该也没人转载): https://blog.csdn.net/hzk_cpp/article/details/88916219
题目:POJ1456.
题目大意:给定
个物品,其中第
个价值为
,并且要在时间点
之前卖出才有
的价值.现在每天只能买一个物品,求最大价值和.
.
很容易想到一个贪心策略,先按照价值从小到大排序,然后依次放入.对于每个物品 ,若 前还有没有被占领的时间点就放到这之中最迟的时间点上,否则就抛弃这个物品.
发现这个算法是 的,考虑优化.
考虑使用并查集,把每一个时间点看成一个点,每个点的祖先就是在这个时间点之前最迟的空位,这样就可以做到 解决此题了.
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=10000;
struct thing{
int t,v;
bool operator < (const thing &p)const{return v<p.v;}
}a[N+9];
int n,mx,fa[N+9],sum;
int get(int u){return u^fa[u]?fa[u]=get(fa[u]):u;}
Abigail into(){
for (int i=1;i<=n;++i){
scanf("%d%d",&a[i].v,&a[i].t);
mx=max(mx,a[i].t);
}
}
Abigail work(){
sort(a+1,a+1+n);
for (int i=0;i<=mx;++i) fa[i]=i;
int u;
sum=0;
for (int i=n;i>=1;--i){
u=get(a[i].t);
if (!u) continue;
sum+=a[i].v;
fa[u]=get(u-1);
}
}
Abigail outo(){
printf("%d\n",sum);
}
int main(){
while (~scanf("%d",&n)){
into();
work();
outo();
}
return 0;
}