您的位置:首页 > 其它

UVALive 6424 —— Russian Dolls(贪心)

2014-09-05 19:26 489 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: