首页 > 代码库 > hdu 1069
hdu 1069
题意:把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长
和宽短;求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等).
思路:其实就是求最长的单调递减序列。在长和宽的递减下,求最大能得出的最大高度了
#include<iostream> #include<cstdio> using namespace std; struct po { int x; int y; int z; }p[200]; int com(const void *a,const void *b) { struct po *c=(po *)a; struct po *d=(po *)b; if(c->x==d->x) return c->y-d->y; return c->x-d->x; } int t=1; int main() { int n,i,j,xx,yy,zz,len,max; while(cin>>n&&n!=0) { len=0; for(i=0;i<n;i++) { cin>>xx>>yy>>zz; p[len].x=xx; p[len].y=yy; p[len].z=zz; ++len; p[len].x=yy; p[len].y=xx; p[len].z=zz; ++len; p[len].x=zz; p[len].y=yy; p[len].z=xx; ++len; p[len].x=yy; p[len].y=zz; p[len].z=xx; ++len; p[len].x=xx; p[len].y=zz; p[len].z=yy; ++len; p[len].x=zz; p[len].y=xx; p[len].z=yy; ++len; } qsort(p,len,sizeof(p[1]),com); for(i=1;i<len;i++) { max=0; for(j=0;j<i;j++) if(((p[i].x>p[j].x&&p[i].y>p[j].y)||(p[i].x>p[j].y&&p[i].y>p[j].x))&&p[j].z>max) max=p[j].z; p[i].z=p[i].z+max; } max=0; for(i=0;i<len;i++) if(p[i].z>max) max=p[i].z; cout<<"Case "<<t<<": maximum height = "<<max<<endl; t++; } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。