UVALive 6424 —— Russian Dolls(贪心)

来源:互联网 发布:java监控系统日志抓取 编辑:程序博客网 时间:2024/06/10 18:04

题目: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
原创粉丝点击