一天刷三道动规小练,这月刚好可以把动规小练AK,当然晚上有时候还会有比赛就不能刷题了,所以要加油啊,这道题还好吧,不算太难,老是控制不住看别人博客的习惯,看一道题没思路,就老是想看别人的博客,唉~~不过这道题还好,自己想了几种方法,结果总能发现自己想的方法的欠缺的地方,最后终于自己想出来了,题意是给你几个长方体(每一种无限个),问如果叠加起来,最多能叠加多高,下面的长方体的底面积的长和宽要严格大于上面的长方体的长和宽,这样的话,每一个长方体都有三种状态,即高不一样,然后分别按照长,宽按从小到大排序,然后把所有长方体遍历一遍,对应每一个长方体,从目前位置到最小的长方体再遍历一遍,求出长和宽分别小于自己的长方体的最大高,然后给对应的长方体加上这个高,这样跑一遍,最后在从所有的长方体里再求最大的那个高,然后就是所求的高,(不知道能不能大一时参加省赛,唉~~~~)
1 10 20 30 2 6 8 10 5 5 5 7 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 0
Case 1: maximum height = 40 Case 2: maximum height = 21 Case 3: maximum height = 28 Case 4: maximum height = 342
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define swap(a,b) a^=b^=a^=b
#define max(a,b) a>b?a:b
using namespace std;
struct stu
{
int x,y,h;
} a[100];
int cmp(stu a,stu b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
int n,S=0;
while(scanf("%d",&n)&&n)
{
int i,k=0,j,aa,bb,cc;
for(i=1; i<=n; i++)
{
scanf("%d%d%d",&aa,&bb,&cc);
a[++k].x=aa,a[k].y=cc,a[k].h=bb;
a[++k].x=cc,a[k].y=bb,a[k].h=aa;
a[++k].x=bb,a[k].y=aa,a[k].h=cc;
}
for(i=1; i<=k; i++)
if(a[i].x<a[i].y)
swap(a[i].x,a[i].y);
sort(a+1,a+k+1,cmp);
for(i=2; i<=k; i++)
{
int d=0;
for(j=i-1; j>=1; j--)
if(a[j].x<a[i].x&&a[j].y<a[i].y&&a[j].h>d)
{
d=a[j].h;
}
a[i].h+=d;
}
int maxh=0;
for(i=1; i<=k; i++)
{
if(a[i].h>maxh)
maxh=a[i].h;
}
printf("Case %d: maximum height = ",++S);
printf("%d\n",maxh);
}
}