UVALive 6424 —— Russian Dolls(贪心)

题目:Russian Dolls

题意:每个玩具有占用的空间和内部可容纳的空间。规定每个玩具只能直接嵌套一个玩具,可以间接嵌套,即A套B,B再套C,但是不能A同时套B和C。A能套B的条件是A的内部空间严格大于B的占用空间。第i个玩具有一个单位花费ci,乘以该玩具内部还剩于的空间即为花费。

现在要问的是经过适当的嵌套之后,最小花费是多少。

囧。。。堂堂一个贪心即可的问题,我居然分析错复杂度跑去写费用流。。。吃了N发TLE才醒悟。。。

在什么嵌套都没有的情况下,总花费是每个玩具的单位花费*其内部空间 的总和。

显然,每次嵌套会使花费减少。

对于每个玩具,如果要将它套进别的玩具里面,在条件允许的情况下肯定是找单位花费大的套,这样花费减小才快。所以反过来每个玩具也是尽可能找体积大的来套。

所以先按找单位花费从大到小排序,然后开始用玩具来套,记录好哪些玩具已经被嵌套在别人里面就行了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Doll{
	int out, in, cost;
	bool operator < (const Doll &A)const{
		return cost > A.cost;
	}
}d[1010];
int n, sum;
bool used[1010];
int main(){
	while(~scanf("%d", &n)){
		sum = 0;
		for(int i=0; i<n; i++){
			scanf("%d %d %d", &d[i].out, &d[i].in, &d[i].cost);
			sum += d[i].cost * d[i].in;
			used[i] = 0;
		}
		sort(d, d+n);
		for(int i=0; i<n; i++){
			int x = -1;
			for(int j=0; j<n; j++){
				if(!used[j] && d[j].out<d[i].in){
					if(x==-1 || d[j].out>d[x].out)	x=j;
				}
			}
			if(~x){
				sum -= d[x].out * d[i].cost;
				used[x] = 1;
			}
		}
		printf("%d\n", sum);
	}
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值