E
2016-05-09 17:50
253 查看
Problem Description
A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the banana
by placing one block on the top another to build a tower and climb up to get its favorite food.<br><br>The researchers have n types of blocks, and an unlimited supply of blocks of each type. Each type-i block was a rectangular solid with linear dimensions
(xi, yi, zi). A block could be reoriented so that any two of its three dimensions determined the dimensions of the base and the other dimension was the height. <br><br>They want to make sure that the tallest tower possible by stacking blocks can reach the
roof. The problem is that, in building a tower, one block could only be placed on top of another block as long as the two base dimensions of the upper block were both strictly smaller than the corresponding base dimensions of the lower block because there
has to be some space for the monkey to step on. This meant, for example, that blocks oriented to have equal-sized bases couldn't be stacked. <br><br>Your job is to write a program that determines the height of the tallest tower the monkey can build with a
given set of blocks.<br>
Input
The input file will contain one or more test cases. The first line of each test case contains an integer n,<br>representing the number of different blocks in the following data set. The maximum value for n is 30.<br>Each of the next n lines contains three integers
representing the values xi, yi and zi.<br>Input is terminated by a value of zero (0) for n.<br>
Output
For each test case, print one line containing the case number (they are numbered sequentially starting from 1) and the height of the tallest possible tower in the format "Case case: maximum height = height".<br>
Sample Input
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
题目大意:给你几种盒子要求上面的长宽一定比下面的小求一个最大的高度
思路:看完题后感觉这题跟贪心专题的题真的很像,条件变成了长宽了。。但是写起来发现这个也不太一样
做这个题有几个地方是关键,一盒子可以转,一转就是一个新的盒子
第二就是dp了需要记住每种做高的盒子所能到达 的高度然后取最高输出
代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct box
{
int x,y,z;
} ibox[91];
bool cmp( box a, box b ){
if( a.x > b.x ) return true;
else if( a.x == b.x && a.y > b.y ) return true;
return false;
}
int main()
{
int n;
int sum=1;
while (cin>>n&&n!=0)
{
int temp=0;
int x,y,z;
for(int j=0;j<n;j++)
{
cin>>x>>y>>z;
ibox[temp].x=max(x,y);
ibox[temp].y=min(x,y);
ibox[temp].z=z;
ibox[temp+2].x=max(y,z);
ibox[temp+2].y=min(y,z);
ibox[temp+2].z=x;
ibox[temp+1].x=max(x,z);
ibox[temp+1].y=min(x,z);
ibox[temp+1].z=y;
temp+=3;
}
sort(ibox,ibox+3*n,cmp);
int dp[100];
memset( dp, 0, sizeof( dp ));
int ans = 0;
for( int i = 0; i < 3 * n; i++ ){
for( int j = 0; j < i; j++ )
if( ibox[i].x <ibox[j].x && ibox[i].y < ibox[j].y ){
dp[i] = max( dp[i], dp[j] );
}
dp[i] += ibox[i].z;
ans = max( ans, dp[i] );
}
cout << "Case " << sum++ << ": maximum height = " << ans << endl;
}
return 0;
}
A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the banana
by placing one block on the top another to build a tower and climb up to get its favorite food.<br><br>The researchers have n types of blocks, and an unlimited supply of blocks of each type. Each type-i block was a rectangular solid with linear dimensions
(xi, yi, zi). A block could be reoriented so that any two of its three dimensions determined the dimensions of the base and the other dimension was the height. <br><br>They want to make sure that the tallest tower possible by stacking blocks can reach the
roof. The problem is that, in building a tower, one block could only be placed on top of another block as long as the two base dimensions of the upper block were both strictly smaller than the corresponding base dimensions of the lower block because there
has to be some space for the monkey to step on. This meant, for example, that blocks oriented to have equal-sized bases couldn't be stacked. <br><br>Your job is to write a program that determines the height of the tallest tower the monkey can build with a
given set of blocks.<br>
Input
The input file will contain one or more test cases. The first line of each test case contains an integer n,<br>representing the number of different blocks in the following data set. The maximum value for n is 30.<br>Each of the next n lines contains three integers
representing the values xi, yi and zi.<br>Input is terminated by a value of zero (0) for n.<br>
Output
For each test case, print one line containing the case number (they are numbered sequentially starting from 1) and the height of the tallest possible tower in the format "Case case: maximum height = height".<br>
Sample Input
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
题目大意:给你几种盒子要求上面的长宽一定比下面的小求一个最大的高度
思路:看完题后感觉这题跟贪心专题的题真的很像,条件变成了长宽了。。但是写起来发现这个也不太一样
做这个题有几个地方是关键,一盒子可以转,一转就是一个新的盒子
第二就是dp了需要记住每种做高的盒子所能到达 的高度然后取最高输出
代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct box
{
int x,y,z;
} ibox[91];
bool cmp( box a, box b ){
if( a.x > b.x ) return true;
else if( a.x == b.x && a.y > b.y ) return true;
return false;
}
int main()
{
int n;
int sum=1;
while (cin>>n&&n!=0)
{
int temp=0;
int x,y,z;
for(int j=0;j<n;j++)
{
cin>>x>>y>>z;
ibox[temp].x=max(x,y);
ibox[temp].y=min(x,y);
ibox[temp].z=z;
ibox[temp+2].x=max(y,z);
ibox[temp+2].y=min(y,z);
ibox[temp+2].z=x;
ibox[temp+1].x=max(x,z);
ibox[temp+1].y=min(x,z);
ibox[temp+1].z=y;
temp+=3;
}
sort(ibox,ibox+3*n,cmp);
int dp[100];
memset( dp, 0, sizeof( dp ));
int ans = 0;
for( int i = 0; i < 3 * n; i++ ){
for( int j = 0; j < i; j++ )
if( ibox[i].x <ibox[j].x && ibox[i].y < ibox[j].y ){
dp[i] = max( dp[i], dp[j] );
}
dp[i] += ibox[i].z;
ans = max( ans, dp[i] );
}
cout << "Case " << sum++ << ": maximum height = " << ans << endl;
}
return 0;
}
相关文章推荐
- 4000 安卓中搜索本地音乐图片方面详解(音乐图片,切图,画图,描边)
- Android 对话框
- java基础部分总结第一部分
- 交换机和路由器的区别
- cocos2dx拖尾做个记录
- 仿360新闻的热搜图片,win8风格随机九宫格布局
- $(window).load(function() {})和$(document).ready(function(){})的区别
- Nginx负载均衡+动静分离
- uWSGI详解
- android 屏幕适配
- 为什么字符减'0'可以到相应的整数
- spring中用@responsebody返回json时出现乱码问题
- Android RSA非对称加密解密算法
- [Android] ImageView.ScaleType设置图解
- 稀疏矩阵的普通转置与快速转置算法
- 奋斗吧,程序员——第三十二章 十年磨一剑,霜刃未曾试
- 基本数据类型
- ZOJ 3875-Lunch Time【模拟】
- JDBC学习笔记
- Job和Task运行时信息的维护