【得物2023-08-29笔试第2题-解题笔记】

最高的楼

  • 在某市的规划中有这样一条要求,位于一条街道上的相邻位置的楼的高度差不能超过1m。每栋楼的高度都是整数
  • 某同学第一次来到这个城市,他听人提起在一条街上,有n栋连续的建筑,这些建筑的总的高度是m米。
  • 他想知道在这条街道上,第x栋建筑可能的最高高度是多少,不存在高度为0的建筑。也就是说这n栋建筑至少高1m。
  1. 输入描述
    输入仅有一行,包含三个整数n,m,x。(1<=n<=m<=10^9,1<=x<=n)
  2. 输出描述
    输出仅包含一个正整数,请你输出第x栋建筑可能的最高高度是多少。
  • 样例输入:5 6 1
  • 样例输出:2

做题思路
自测样例

代码如下:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n = 0, m = 0, x = 0; // 楼栋数量 总高度 目标楼栋位置
    cin >> n >> m >> x;

    int ans = 1; // 记录最后 x 的高度 初始化为1

    // 所有房子都加1层 因为题目中写到每个楼栋至少高1m
    m -= n;
    int left = max(x - 1, 0); // 给左边加层 的最大左边界
    int right = min(x + 1, n + 1); // 给右边加层的 最小右边界
    // 当房子剩余总层数大于0时循环尝试给x加层
    while(m > 0){
        m--; // 给x处加一层
        // 给左右加层
        int increase_l = x - (left + 1);
        int increase_r = right - (x + 1);
        int increase = increase_l + increase_r;
        cout << increase << endl; // 打印一下
        // 更新 left 和 right
        left = max(left - 1, 0);
        right = min(right + 1, n + 1);
        // 更新 m
        m -= increase;
        // 判断 m 是否大于等于0 如果是 则x处加层成功
        if(m >= 0) ans++;
    }
    cout << "The final ans = " << ans << endl;
    return 0;
}

总结

每次x处加1层,要分别考虑一下左边加的总层数和右边加的总层数,然后注意一下left和right到达左右边界的情况。
没有加完的层数不管就是了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值