标签:cas 不能 turn bsp ase 排列 using 问题 log
The Tower of Babylon
题意:给你n种石头,长x,宽y,高z,每种石头数目无限,一块石头能放到另一块上的条件是:长和宽严格小于下面的石头。问叠起来的最大高度。
/* 有些类似“叠箱子”问题,看起来一种砖有无限多个,其实最多只能用到两次。 说下我的思路吧,一块砖有3个数据,虽然3!=6,但本质上还是只有3种,把这三种都表示出来,使x<=y;这样就有了3n组数据。因为我不会建图,就把这3n组数据再排列一下,使一块砖只能放到它后面的砖之上,而绝不能放到之前的砖上,即按x为一级y为二级升序排列,结合之前的x<=y,就能达到目的了。 */ #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; typedef struct { int arr[3]; }Box; Box a[100]; bool cmp(Box a,Box b) { if(a.arr[0]!=b.arr[0]) return a.arr[0] < b.arr[0]; else if(a.arr[1] != b.arr[1]) return a.arr[1] < b.arr[1]; else return a.arr[2] < b.arr[2]; } int ok(Box a,Box b) { return (a.arr[0] < b.arr[0] && a.arr[1] < b.arr[1]); } int main() { //freopen("Cola.in","r",stdin); int n,m=0,i,j,t,max; while(cin>>n,n) { m++; for(i = 0; i < 3*n; i += 3) { cin>>a[i].arr[0]>>a[i].arr[1]>>a[i].arr[2]; sort(a[i].arr,a[i].arr+3); a[i+1].arr[0] = a[i].arr[0]; a[i+1].arr[1] = a[i].arr[2]; a[i+1].arr[2] = a[i].arr[1]; a[i+2].arr[0] = a[i].arr[1]; a[i+2].arr[1] = a[i].arr[2]; a[i+2].arr[2] = a[i].arr[0]; } sort(a,a+3*n,cmp); max = 0; for(i = 3*n-2; i >= 0; i--) { t = a[i].arr[2]; for(j = i+1; j < 3*n; j++) { if(ok(a[i],a[j]) && a[i].arr[2]+a[j].arr[2] > t) t = a[i].arr[2]+a[j].arr[2]; } a[i].arr[2] = t; if(t > max) max = t; } printf("Case %d: maximum height = %d\n",m,max); } return 0; }
标签:cas 不能 turn bsp ase 排列 using 问题 log
原文地址:http://www.cnblogs.com/thmyl/p/7400202.html