zoukankan      html  css  js  c++  java
  • 猴子的智商

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/B

    题目:

    Description

    一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉挂在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉。
     
    研究人员有n种类型的砖块,每种类型的砖块都有无限个。第i块砖块的长宽高分别用xi,yi,zi来表示。 同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高。
     
    在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的上面,因为必须留有一些空间让猴子来踩。
     
    你的任务是编写一个程序,计算猴子们最高可以堆出的砖块们的高度。

    Input

    输入文件包含多组测试数据。
    每个测试用例的第一行包含一个整数n,代表不同种类的砖块数目。n<=30.
    接下来n行,每行3个数,分别表示砖块的长宽高。
    当n= 0的时候,无需输出任何答案,测试结束。

    Output

    对于每组测试数据,输出最大高度。格式:Case 第几组数据: maximum height = 最大高度

    Sample Input

    1
    10 20 30 

    6 8 10 
    5 5 5 

    1 1 1 
    2 2 2 
    3 3 3 
    4 4 4 
    5 5 5 
    6 6 6 
    7 7 7 

    31 41 59 
    26 53 58 
    97 93 23 
    84 62 64 
    33 83 27 

    Sample Output

    Case 1: maximum height = 40
    Case 2: maximum height = 21 
    Case 3: maximum height = 28 
    Case 4: maximum height = 342 
     
    分析:
    因为一块砖有长宽高3个不同的边,所以每一组数据都有3个不同的高。
    保存砖块 的长宽高,按照砖块长宽进行降序排列,因为要使长宽大的尽量拍在下面,
    这样堆积其来的才高。所以长从大到小进行排序。
    #include<iostream>
      #include<algorithm>
      using namespace std;
      struct node
      {
         int x,y,z;
      }d[105];
     int cmp( node a, node b) 
       {
         if(a.y!=b.y) return a.y>b.y;
         else return a.x>b.x;
       }
      int max(int a,int b)
      {     
          if(a>b)  return a;
             else return b;
      }
     int min(int a,int b)
     {
       if(a<b)  return a;
            else return b;
     }
     int main()
     {
         int c=0,n;
         int B[105];
         while(cin>>n&&n)
         {
             c++;
             int i,j,k;
             for(j=0,i=0;i<n;i++) 
               {
                   int a,b,c;
                   cin>>a>>b>>c;
                  d[j].x=min(a,b);d[j].y=max(a,b);d[j++].z=c;
                  d[j].x=min(a,c);d[j].y=max(a,c);d[j++].z=b;
                  d[j].x=min(b,c);d[j].y=max(b,c);d[j++].z=a;
               }
               k=j;
               sort(d,d+k,cmp);
               int sum=0;
               for(i=0;i<k;i++)
               {
                  B[i]=d[i].z;
                   for(j=0;j<i;j++)
                   {
                     if(d[j].x>d[i].x&&d[j].y>d[i].y&&B[j]+d[i].z>B[i])
                           B[i]=B[j]+d[i].z;
                      }
                   if(B[i]>sum) sum=B[i];
               }
               cout<<"Case "<<c<<": maximum height = "<<sum<<endl;
         }
         return 0;
     }
     
       
  • 相关阅读:
    每日日报2020.12.1
    每日日报2020.11.30
    981. Time Based Key-Value Store
    1146. Snapshot Array
    565. Array Nesting
    79. Word Search
    43. Multiply Strings
    Largest value of the expression
    1014. Best Sightseeing Pair
    562. Longest Line of Consecutive One in Matrix
  • 原文地址:https://www.cnblogs.com/fenhong/p/4731154.html
Copyright © 2011-2022 走看看