Uvalive 6424 - Russian Dolls (贪心)

来源:互联网 发布:淘宝卖家如何发动态 编辑:程序博客网 时间:2024/06/08 18:04

【题目链接】:click here~~

【题目大意】:

每个玩具有占用的空间和内部可容纳的空间。规定每个玩具只能直接嵌套一个玩具,可以间接嵌套,即A套B,B再套C,但是不能A同时套B和C。A能套B的条件是A的内部空间严格大于B的占用空间。第i个玩具有一个单位花费ci,乘以该玩具内部还剩于的空间即为花费。要问的是经过适当的嵌套之后,最小花费是多少。

【思路】:贪心问题,数据不大,两层for循环判断
显然,每次嵌套会使花费减少。
对于每个玩具,如果要将它套进别的玩具里面,在条件允许的情况下肯定是找单位花费大的套,这样花费减小才快。按找单位花费从大到小排序,注意当花费一样的时候,内部体积从大到小(ps:实测uvalive体积按小到大也对)

代码:

#include <bits/stdc++.h>using namespace std;const int N=1010;int n,m,t;struct node{    int out,in,c;} p[N];bool cmp(node a,node b)// sort the cost and volume{    if(a.c==b.c) return a.in>b.in;    else  return a.c>b.c;}bool vis[N];int main(){    while(scanf("%d",&n)!=EOF)    {        memset(vis,false,sizeof(vis));        int k,jj,sum,maxx=0;        for(int i=1; i<=n; ++i)        {            scanf("%d%d%d",&p[i].out,&p[i].in,&p[i].c);        }        sort(p+1,p+n+1,cmp);        sum=0;        for(int i=1; i<=n; ++i)        {            int maxx=0;            for(int j=1; j<=n; ++j)            {                if(i==j) continue;                if(!vis[j]&&p[j].out<p[i].in)                {                    maxx=max(maxx,p[j].out);                }            }            if(maxx!=0)            {                for(int j=1; j<=n; ++j)                {                    if(!vis[j]&&p[j].out==maxx)                    {                        vis[j]=true;                        break;                    }                }            }            sum+=(p[i].in-maxx)*p[i].c;        }        cout<<sum<<endl;    }    return 0;}/*35 4 14 2 23 2 17after sort:4 2 2  //内部没有装其他玩具,总花费=2*2=43 2 1  //内部没有装其他玩具,总花费=2*1=25 4 1  //把外部体积为3的玩具装入,则花费=(4-3)*1=1;所以总共=4+2+1=7*/



0 0
原创粉丝点击