【题目链接】:​​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
*/