Uvalive 6424 - Russian Dolls (贪心)

【题目链接】: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;
}

/*
3
5 4 1
4 2 2
3 2 1
7
after sort:
4 2 2  //内部没有装其他玩具,总花费=2*2=4
3 2 1  //内部没有装其他玩具,总花费=2*1=2
5 4 1  //把外部体积为3的玩具装入,则花费=(4-3)*1=1;所以总共=4+2+1=7
*/



你可能感兴趣的:(排序,贪心)