Description
将矩形放到框里(框的最大宽度给出),放不下,就放下一行。注意这里不能旋转,求最后放好后的宽度和高度
Input
多组用例,每组用例第一行为框的最大宽度,之后为每个小矩形的宽和高,以-1 -1结束一组用例输入,以0结束全部输入
Output
对于每组用例,输出放好后的宽度和高度
Sample Input
35
10 5
20 12
8 13
-1 -1
25
10 5
20 13
3 12
-1 -1
15
5 17
5 17
5 17
7 9
7 20
2 10
-1 -1
0
Sample Output
30 x 25
23 x 18
15 x 47
Solution
简单题,按题意描述来更新高度和宽度最大值即可即可
Code
#include<stdio.h>
#define max(x,y) (x>y?x:y)
int main()
{
int n,l[100],w[100],i,j,maxl,maxw,maxll,maxww;
while(scanf("%d",&n)&&n)
{
i=0;
while(scanf("%d%d",&l[i],&w[i])&&l[i]!=-1&&w[i++]!=-1);
j=i;//j为矩形个数
maxl=maxw=maxll=maxww=0;//maxl和maxw分别记录每行的宽度和高度,maxll和maxww记录长度、高度最大值
for(i=0;i<j;i++)
{
if(maxl+l[i]<=n)//能放下
{
maxl+=l[i];//该行宽度累加
maxw=max(maxw,w[i]);//更新该行高度
if(i==j-1)//如果是最后一个矩形则需更新宽度高度最大值
{
maxll=max(maxl,maxll);
maxww+=maxw;
}
}
else if(maxl+l[i]>n)//放不下,换行
{
maxll=max(maxl,maxll);//先更新最大宽度
maxl=0;//该行宽度清零
maxww+=maxw;//更新最大高度
maxw=0;//该行高度清零
maxl+=l[i];//该行宽度累加
maxw=max(maxw,w[i]);//更新该行高度
if(i==j-1)//如果是最后一个矩形则需更新宽度高度最大值
{
maxll=max(maxl,maxll);
maxww+=maxw;
}
}
}
printf("%d x %d\n",maxll,maxww);
}
}