poj 1456 贪心+并查集优化(卖带截止时间货物的最大利润)

题意:给定若干商品,每种商品有两个属性,一个是其售价,另一个是其最晚售出时间,超过这个时间此商品就算作废。每单位时间最多出售一种商品。给定出n个商品的属性值,问怎样安排这些商品能使得利益最大(假设商品想卖就卖)。

思路:一开始自己的思路是按照截止时间从大到小排序,相同的截止时间按照售价从大到小排序,每次挑截止时间最大且售价最大的那个,然后将剩下中的和选出截止时间相同的时间都减1,再排序。每轮都排序浪费时间所以TLE,不知道这个思路加优先队列优化行不行……

正确的思路是按照售价从大到小排序,用并查集优化。那么find(x)表示x时间之前最大的可出售时间。

#include <stdio.h>
#define N 10005
struct node{
	int t,w;
}p[N];
int n,father[N];
int cmp(const struct node *a,const struct node *b){
	if((*a).w == (*b).w)
		return (*b).t - (*a).t;
	return (*b).w - (*a).w;
}
int find(x){
	if(father[x] == x)
		return x;
	return father[x] = find(father[x]);
}
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d",&n)!=EOF){
		int i,j,res=0;
		for(i = 0;i<N;i++)
			father[i] = i;
		for(i = 0;i<n;i++)
			scanf("%d %d",&p[i].w,&p[i].t);
		qsort(p,n,sizeof(struct node),cmp);//按照售价排序
		for(i = 0;i<n;i++){
			int temp = find(p[i].t);//可出售的最大位置
			if(temp){//如果有位置
				res += p[i].w;
				father[temp] = find(temp-1);//此位置不行了,并查集连接到下一位置
			}
		}
		printf("%d\n",res);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值