积木
时间限制: 1 Sec 内存限制: 16 MB
题目描述
在一个矩形的坑的底部,无缝地铺了一层积木(为简单起见,本题中,用矩形表示积木),如下图所示(阴影部分表示地,中空的部分表示坑,所有的白色矩形都表示坑底的积木):

现在,我们要在这个坑中再放入一块正方形积木,但我们希望这块积木的位置最低。如下图所示,左图中的灰色积木的位置就比右图中灰色积木的位置更好(本题不考虑重力因素,假定新放入的积木不会倾倒,它的边永远平行于坑壁)。而且,可以看出,左图中灰色方块的位置是所有可能的位置中最低的位置(本题中,假定坑足够宽也足够深,后加的那块积木不会放不进去)。

如果事先给定所有事先铺好的积木的信息和后加的积木的信息,请编写程序寻找一下它的最低位置。
输入
第一行为一个整数 n (1 <= n <= 20 ),表示坑底积木的数量。
之后 n 行,每行两个整数,依次表示从左至右的每块积木的宽度和高度(以厘米为单位)。
最后一行中还有一个整数 m,表示后加的积木的边长(以厘米为单位)。
输出
只有一个整数,表示将后加的积木放入坑中最低位置之后,它的上沿距离坑底地面的高度。
样例输入
2
10 40
15 60
20
样例输出
80
解题目标
寻找最低的可存放点
解题思路
先判断每个积木上最大可放置边长为多少的正方形积木,然后遍历所有积木,找到最小值
AC代码
c#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct ppppp
{
int width;
int height;
int fit;
} block[999];//定义积木结构体
int main ()
{
int n,i,j,l;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d %d",&block[i].width,&block[i].height);
block[i].fit=block[i].width;
}
int maxxx=block[0].height;
for(i=1; i<n; i++)
if(block[i].height>maxxx)
maxxx=block[i].height;
int m;
int flag=1;
for(i=0; i<n; i++)//计算每个积木上方可放置的积木的最大宽度
{
flag=1;
for(j=i-1; j>=0&&flag==1; j--)
{
if(block[j].height<=block[i].height)
{
block[i].fit=block[j].width+block[i].fit;
}
else
flag=0;
}
flag=1;
for(j=i+1; j<n&&flag==1; j++)
{
if(block[j].height<=block[i].height)
{
block[i].fit=block[j].width+block[i].fit;
}
else
flag=0;
}
}
scanf("%d",&m);//输入待放置的积木的边长
int minn=1000;
int x;
flag=0;
for(i=0; i<n; i++)//遍历所有积木,找到最低点
{
if(block[i].fit>=m)
{
x=block[i].height+m;
if(x<minn)
minn=x;
flag=1;
}
}
if(flag==1)
printf("%d\n",minn);
else
printf("%d\n",maxxx+m);
return 0;
}
754

被折叠的 条评论
为什么被折叠?



