Monkey and Banana 动规小练

Monkey and Banana
原题链接https://vjudge.net/contest/349774#problem/C
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题意大概为用现有的箱子搭出来一个最高的台阶
只有当一个箱子的长和宽都小于另一个箱子时,才能放到另一个箱子上面,本题需要考虑的主要是如何确定每个箱子的长宽高,之后用背包将每个箱子上面放的箱子的最大值求出,最后取最大值即可。
对于一个箱子的三围而言,他们可以是长宽高的任意一个,也就是说每个箱子的三围数据都代表着6种情况,但是当三围中有两个值相等或者三个值都相等时会有重复情况,要特判舍去。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
long long a[10005];
long long dp[10005];
struct node//结构体储存长宽高以及这个箱子上能放的箱子的高度
{
	long long x,y,h;
	long long dp;
} stu[10005];
bool cmp(node xx,node yy)//由长宽的大小对箱子进行排序
{
	if(xx.x==yy.x)
	{
		return xx.x<yy.y;
	}
	return xx.x<yy.x;
}
int main()
{
	long long n,sum=0,z=0,x1,y1,h1;
	while(~scanf("%lld",&n))
	{
		if(n==0)
		{
			break;
		}
		sum++;
		z=0;
		while(n--)
		{
			scanf("%lld %lld %lld",&x1,&y1,&h1);//将所有数据的不重复情况输入结构体重储存。
			if(x1==y1)
			{
				if(y1==h1)
				{
					stu[z].x=x1;
					stu[z].y=y1;
					stu[z].h=h1;
					stu[z].dp=stu[z].h;
					z++;
				}
				else
				{
					stu[z].x=x1;
					stu[z].y=y1;
					stu[z].h=h1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=h1;
					stu[z].y=y1;
					stu[z].h=x1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=y1;
					stu[z].y=h1;
					stu[z].h=x1;
					stu[z].dp=stu[z].h;
					z++;
				}
			}
			else
			{
				if(y1==h1)
				{
					stu[z].x=x1;
					stu[z].y=y1;
					stu[z].h=h1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=h1;
					stu[z].y=y1;
					stu[z].h=x1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=y1;
					stu[z].y=x1;
					stu[z].h=h1;
					stu[z].dp=stu[z].h;
					z++;
				}
				else if(x1==h1)
				{
					stu[z].x=x1;
					stu[z].y=y1;
					stu[z].h=h1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=y1;
					stu[z].y=h1;
					stu[z].h=x1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=x1;
					stu[z].y=h1;
					stu[z].h=y1;
					stu[z].dp=stu[z].h;
					z++;
				}
				else
				{
					stu[z].x=x1;
					stu[z].y=y1;
					stu[z].h=h1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=x1;
					stu[z].y=h1;
					stu[z].h=y1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=y1;
					stu[z].y=x1;
					stu[z].h=h1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=y1;
					stu[z].y=h1;
					stu[z].h=x1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=h1;
					stu[z].y=y1;
					stu[z].h=x1;
					stu[z].dp=stu[z].h;
					z++;
					stu[z].x=h1;
					stu[z].y=x1;
					stu[z].h=y1;
					stu[z].dp=stu[z].h;
					z++;
				}
			}
		}
		sort(stu,stu+z,cmp);
		long long maxx=-10086,i,j;
		for(i=1; i<z; i++)//由于是按长宽由小到大排序,从小到大遍历每个箱子之前的箱子能否放到箱子上面。
		{
			for(j=0; j<i; j++)//遍历到当前判断的箱子即可,之后的箱子必有一项数据大于当前箱子,即不可取
			{
				if(stu[i].x>stu[j].x&&stu[i].y>stu[j].y)
				{
					stu[i].dp=max(stu[j].dp+stu[i].h,stu[i].dp);//当前箱子加上箱子上放的那个箱子能放的最大值,判断是否要放当前箱子。
				}
			}
			if(stu[i].dp>maxx)//比较出最高的一个
			{
				maxx=stu[i].dp;
			}
		}
		printf("Case %lld: maximum height = %lld\n",sum,maxx);
	}
	return 0;
}
发布了130 篇原创文章 · 获赞 3 · 访问量 1620

猜你喜欢

转载自blog.csdn.net/yeyuluo/article/details/103913230