Monkey and Banana

Monkey and Banana

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.

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.

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.

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.

Input

The input file will contain one or more test cases. The first line of each test case contains an integer n, representing the number of different blocks in the following data set. The maximum value for n is 30. Each of the next n lines contains three integers representing the values xi, yi and zi. Input is terminated by a value of zero (0) for n.

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”.

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

翻译:

一群研究人员正在设计一个实验来测试猴子的智商。他们会在楼顶挂一根香蕉,同时给猴子提供一些积木。如果猴子够聪明的话,它就可以把一个街区放在另一个街区的顶端来建造一座塔,爬上去得到它最喜欢的食物。 研究人员有n种类型的区块,每种类型的区块都有无限的供应。每一个I型块是一个具有线性尺寸的矩形实体(Xi,Yi,Zi)。一个块可以重新定位,使其三维中的任何两个确定了基础的尺寸,而另一个尺寸是高度。
他们想通过堆积木来确保最高的塔能到达屋顶。问题是,在建造一座塔楼时,只要上一座塔楼的两个底座尺寸都严格小于下一座塔楼的相应底座尺寸,一座塔楼就只能放在另一座塔楼的顶部,因为猴子必须有一定的空间才能踩上去。这意味着,例如,面向具有相同大小基的块不能堆叠。
你的工作是编写一个程序来确定猴子用一组给定的积木可以建造的最高的塔的高度。

输入

输入文件将包含一个或多个测试用例。每个测试用例的第一行包含一个整数n, 表示以下数据集中不同块的数目。n的最大值为30。每一个N行包含三个表示值Xi、Yi和Zi的整数。输入以n的0结束。

输出

对于每一个测试用例,打印一个包含案例号的行(它们是从1开始顺序编号)和最高的可能塔的高度,格式为“案例:最大高度=高度”。
题意: 题目说研究人员可以为猴子提供没有数量限制的一定长宽高的长方体积木块,让猴子自己来搭一个塔,但是要严格按照下面长方体的长和宽都>上方的长方体的长和宽,求猴子可以搭出塔的最大高度.
思路: 虽然说是可以无限取积木块,但是经过由题目要求的下面长方体的长和宽都严格大于上方的长方体的长和宽,可以得知每种样式得长方体块最多只能选三个,知道这条信息之后,我们就可以简化该问题,首先我们可以用结构体把每种样式的三种类型存入,接着在用sort排序将长或宽进行排序,最后用求最大递增子序列的思维求最大高度即可.

由我的思路所写出的AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct lport
{
    int lon,wei,h;
}vis[10005];
bool cmp(lport a,lport b)
{
    return a.lon<b.lon;
}
int main()
{
    int n,t=1;
    while(~scanf("%d",&n))
    {
        if(n==0)
            return 0;
        int k=1,dp[10005];
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            vis[k].lon=max(x,y);
            vis[k].wei=min(x,y);
            vis[k].h=z;k++;
            vis[k].lon=max(x,z);
            vis[k].wei=min(x,z);
            vis[k].h=y;k++;
            vis[k].lon=max(z,y);
            vis[k].wei=min(z,y);
            vis[k].h=x;k++;
        }sort(vis+1,vis+k,cmp);k--;
        for(int i=1;i<=k;i++)
        {dp[i]=vis[i].h;
            for(int j=1;j<=i;j++)
            {
                if(vis[i].lon!=vis[j].lon&&vis[i].wei>vis[j].wei)
                    dp[i]=max(dp[i],dp[j]+vis[i].h);
            }
        }sort(dp+1,dp+k+1);
        printf("Case %d: maximum height = %d\n",t,dp[k]);
        t++;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> int main(){ void gobox(int a,int b); void getbox(); void findbanana(int a,int b); void getbanana(); int monkey,banana,box; printf("请依次输入猴子,香蕉,箱子 的位置\n"); printf("猴子的位置:"); scanf("%d",&monkey); printf("香蕉的位置:"); scanf("%d",&banana); printf("箱子的位置:"); scanf("%d",&box); printf("-----------------------------------\n"); if(monkey!=box){ printf("猴子够不到香蕉,要先去搬箱子:"); gobox(monkey,box); getbox(); if(box!=banana){ printf("猴子需要搬着箱子去找到香蕉:"); findbanana(banana,box); getbanana(); }else{ printf("香蕉就在箱子的上面\n"); getbanana(); } }else{ printf("箱子就在猴子旁边,猴子拿到了箱子"); getbox(); if(box!=banana){ printf("猴子需要搬着箱子去找到香蕉:"); findbanana(banana,box); getbanana(); }else{ printf("香蕉就在箱子的上面\n"); getbanana(); } } } void gobox(int a,int b){ int flag; flag = b - a; if(flag>0){ printf("Run(monkey,box)\n"); printf("猴子需要向右移动%d步拿到箱子\n",flag); }else{ printf("Run(monkey,box)\n"); printf("猴子需要向左移动%d步拿到箱子\n",flag); } } void findbanana(int a,int b){ int flag; flag=b-a; if(flag>0){ printf("Run(monkey,banana)\n"); printf("猴子需要向左搬着箱子移动%d步找到香蕉\n",flag); }else{ printf("Run(monkey,banana)\n"); printf("猴子需要向右搬着箱子移动%d步找到香蕉\n",flag); } } void getbox(){ printf("猴子拿到了箱子:"); printf("Getbox(monkey,box)\n"); } void getbanana(){ printf("猴子踩在箱子上拿到了香蕉:"); printf("Getbanana(monkey,banana)\n"); }请输出主要数据定义和主要功能模块设计
05-25

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值