jzxxoj堆积木

积木

时间限制: 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hesorchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值