练习三 1005
2016-05-03 16:18
225 查看
概述:给定一块砖的 长宽高,让你叠金字塔,下面砖的表面积必须大于上面的,求能叠到的最高高度。
思路:先将给定的所有的砖分成三种,这样的话,一块砖就有三种形态,然后将所有的排序,然后挑选,最后将所选的高加到一起即可。
感想:题意不太好理解。
思路:先将给定的所有的砖分成三种,这样的话,一块砖就有三种形态,然后将所有的排序,然后挑选,最后将所选的高加到一起即可。
感想:题意不太好理解。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<iomanip> #define INF 99999999 using namespace std; const int MAX=100; int height[MAX]; typedef struct node{ int w; int l; int h; bool operator<(node b)const{ if(w == b.w)return l>b.l; return w>b.w; } }; node s[MAX]; int main(){ int n,a,b,c,num=1; while(cin>>n,n){ int k=0; for(int i=0;i<n;++i){ cin>>a>>b>>c; //对a,b,c排序. if(a>b)a=a+b,b=a-b,a=a-b; if(a>c)a=a+c,c=a-c,a=a-c; if(b>c)b=b+c,c=b-c,b=b-c; s[k].w=a,s[k].l=b,s[k++].h=c;//以a,b为底,c为高. s[k].w=a,s[k].l=c,s[k++].h=b;//以a,c为底,b为高. s[k].w=b,s[k].l=c,s[k++].h=a;//以b.c为底,a为高. } sort(s,s+k);//排序,以底边中最小的边来排序,这样使得第i个箱子只能放在第i个箱子的前面的箱子上,当然也可以按照底边面积排序. int Max=s[0].h; height[0]=s[0].h; for(int i=1;i<k;++i){ height[i]=s[i].h; for(int j=0;j<i;++j){ if(s[i].w<s[j].w && s[i].l<s[j].l){ height[i]=max(height[i],s[i].h+height[j]); } } Max=max(Max,height[i]); } cout<<"Case "<<num++<<": maximum height = "<<Max<<endl; } return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- 动态规划
- C++ 动态规划
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- DP(动态规划) 解游轮费用问题
- Android对px和dip进行尺寸转换的方法
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划