每日一题之修建灌木
问题描述
爱丽丝要完成一项修剪灌木的工作。
有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晩会长高 1 厘米, 而其余时间不会长高。在第一天的 早晨, 所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数 N, 含义如题面所述。
输出格式
输出 N 行, 每行一个整数, 第 ii 行表示从左到右第 ii 棵树最高能长到多高。
解题思路
-
灌木的生长规律:
- 每棵灌木在被修剪之前,每天都会长高1厘米。
- 灌木的最高高度取决于它两次被修剪之间的时间间隔(即多少天没有被修剪)。
-
修剪周期:
- 对于N棵灌木,爱丽丝的修剪周期是:从左到右,再从右到左,形成一个来回。
- 一个完整的修剪周期需要 2(N−1) 天(因为从最左到最右需要 N−1 天,再从最右到最左也需要 N−1 天)。
-
每棵灌木的最大高度:
- 对于第 i 棵灌木(从左到右编号为1到N),它两次被修剪之间的时间间隔是 2×max(i−1,N−i)。
- 从左到右修剪时,第 i 棵灌木在第 i 天被修剪。
- 从右到左修剪时,第 i 棵灌木在第 N−i+1 天被修剪(从右到左的第 N−i+1 天)。
- 因此,两次修剪之间的天数是 i−1 和 N−i 中的较大值的两倍。
- 对于第 i 棵灌木(从左到右编号为1到N),它两次被修剪之间的时间间隔是 2×max(i−1,N−i)。
数学推导
- 第 i 棵灌木的最大高度为:max_height[i]=2×max(i−1,N−i)
- 这是因为:
- 如果 i 靠近左侧(i≤N/2),则从右到左修剪时,它会在 2(N−i) 天后被修剪。
- 如果 i 靠近右侧(i>N/2),则从左到右修剪时,它会在 2(i−1) 天后被修剪。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
for (int i = 1; i <= N; ++i) {
cout << 2 * max(i - 1, N - i) << endl;
}
return 0;
}