专题三 Problem E

一、题目编号:
          1005
二、简单题意:
       给出一些木块,把这些木块堆起来,要求上边的木快的长和宽都要严格小于下边。而且每一种木块的数量都是无限的,求用这些木块可以堆起的最大高度。
三、解题思路形成过程
       因为木块的摆放方式有三种,所以每种木块可以看作三种木块。将木块根据长和宽进行升序排序,先按木块的长升序排列,长相等时再按"宽"升序排列。从最小的木块进行遍历,符合条件的就加上,输出最大高度。
四、感想
        要注意细节,上边的木快的长和宽都要严格小于下边,等于也不可以。还有最后输出结果细节问题要注意,= 的两边有空格!!!!!
五、AC代码
#include<iostream>
using namespace std;
#include<algorithm>
struct block
{
 int x,y,z;
};

int cmp(block a,block b)//先按木块的"长"升序排列,"长"相等时再按"宽"升序排列
{
 if(a.x!=b.x)
  return a.x<b.x;
 else
  return a.y<b.y;
}
int main()
{
    block blocks[95];
    int f[95];//记录加上第i个木块后的最大高度
 int T,n,a,b,c,i,j,temp,tallest;
 T=1;
 while(cin>>n&&n!=0)
    {
  for(i=0,j=0;j<n;j++)
        {       //每种木块可以有三种放法
   cin>>a>>b>>c;
   blocks[i].x=a; blocks[i].y=b; blocks[i].z=c;
   blocks[i+1].x=a; blocks[i+1].y=c; blocks[i+1].z=b;
   blocks[i+2].x=c; blocks[i+2].y=b; blocks[i+2].z=a;
   i+=3;
  }
  for(i=0;i<n*3;i++)
  {          //找出每种木块的长和宽
   if(blocks[i].x<blocks[i].y)
   {
    temp=blocks[i].x;
    blocks[i].x=blocks[i].y;
    blocks[i].y=temp;
   }
  }
  sort(blocks,blocks+n*3,cmp);
  for(i=0,tallest=0;i<3*n;i++){    //将f[i]初始化为第i个的高度,计算f[i]时,遍历0—>i,找出放上第i个木块时的最大高度。
   f[i]=blocks[i].z;
   for(j=0;j<=i;j++){
    if(blocks[i].x>blocks[j].x&&blocks[i].y>blocks[j].y){
     f[i]=max(f[i],f[j]+blocks[i].z);
    }
    tallest=max(tallest,f[i]);
   }
  }
  cout<<"Case "<<T++<<": maximum height = "<<tallest<<endl;
 }
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值