Problem3-1005
2016-05-12 16:48
411 查看
简单题意:给定一块砖的 长宽高,让你叠金字塔,下面砖的表面积必须大于上面的,求能叠到的最高高度。
解题思路:先将给定的所有的砖分成三种,这样的话,一块砖就有三种形态,然后将所有的排序,然后挑选,最后将所选的高加到一起即可。
代码如下:
#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;
}
解题思路:先将给定的所有的砖分成三种,这样的话,一块砖就有三种形态,然后将所有的排序,然后挑选,最后将所选的高加到一起即可。
代码如下:
#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;
}
相关文章推荐
- SQLite的使用
- 编译 unity3d 的示例代码过程
- phantomjs使用说明
- Linux堆内存管理深入分析(上)
- 【AD/DA】的一些基础知识
- 应用数学(转载)
- Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
- 选择法排序
- seo优化 标点符号
- 使用Visual Studio 2013进行单元测试--初级篇(转http://***/Article/11186)
- Ubuntu Server 15.04的安装
- Java第六次实验
- 安装opensuse的笔记-重庆linux开源组织
- 移动app开发中多种设备尺寸适配问题
- C#学习笔记之图片、字节数组、base64之间的转换
- 动态代理实现
- JS函数的定义与调用方法推荐
- zookeeper数据模型
- 图解JSP与Servlet的关系
- 多线程下载