您的位置:首页 > 其它

POJ-1456 Supermarket【贪心+并查集】

2017-07-12 20:22 399 查看
题目链接:http://poj.org/problem?id=1456

这里其实用贪心做,并查集只是用来作为工具,使得速度更加快。

题目大意是买卖N件东西,每件东西都有个截止时间,在截止时间之前买都可以,而每个单位时间只能买一件。问最大获利。

用并查集来做,将商品的价值从大到小排序,然后对于每个商品从截止日期开始往前推,找到一个空闲的日子,将其占用,然后将其的父节点设为前一个节点,如果不断往前查找均已经被占用,查到0天时停止,表示该商品无法购买
#include<iostream>
#include<cmath>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
#define maxn 10010
int pre[maxn];
int n;
struct node
{
int value,time;
}s[maxn];
bool cmp(node a,node b)
{
return a.value>b.value;
}
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j;
while(i!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
int main()
{
while(~scanf("%d",&n))
{

for(int i=0;i<n;i++)
{
scanf("%d%d",&s[i].value,&s[i].time);
}
sort(s,s+n,cmp);
int sum=0;
for(int i=0;i<=10000;i++)pre[i]=i;
for(int i=0;i<n;i++)
{
int root=find(s[i].time);
if(root>0)
{
sum+=s[i].value;
pre[root]=root-1;
}
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: