最高的楼
- 在某市的规划中有这样一条要求,位于一条街道上的相邻位置的楼的高度差不能超过1m。每栋楼的高度都是整数。
- 某同学第一次来到这个城市,他听人提起在一条街上,有n栋连续的建筑,这些建筑的总的高度是m米。
- 他想知道在这条街道上,第x栋建筑可能的最高高度是多少,不存在高度为0的建筑。也就是说这n栋建筑至少高1m。
- 输入描述
输入仅有一行,包含三个整数n,m,x。(1<=n<=m<=10^9,1<=x<=n) - 输出描述
输出仅包含一个正整数,请你输出第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到达左右边界的情况。
没有加完的层数不管就是了。