修剪灌木OJ链接:蓝桥杯2022年第十三届省赛真题-修剪灌木 - C语言网 (dotcpp.com)
题目描述
爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数 N ,含义如题面所述。
输出格式
输出 N 行,每行一个整数,第i行表示从左到右第 i 棵树最高能长到多高。
样例输入
3
样例输出
4 2 4
提示
对于 30% 的数据,N ≤ 10. 对于 100% 的数据,1 < N ≤ 10000.
思路:题目说爱丽丝每天修剪一棵并且把她修剪到0厘米,然后先从左往右修,再从右往左修,并且每棵灌木一天能长1里面,那么我们就可以推断出一棵灌木拥有三个生长周期:
1.从左往右第一次修剪到目标灌木
2.从右往左第二次修剪到目标灌木
3.第二次修剪到目标灌木后再次从左往右修剪到目标灌木
那么第一次修剪到灌木的生长周期为 i 天
第二次从右往左修剪到目标灌木的生长周期为2*(N-i)天
第二次修剪到目标灌木后再次从左往右修剪到目标灌木的生长周期为2*(i-1)天
C++:
#include <iostream>
using namespace std;
int TallestBush(long long a, long long b, long long c)
{
if (a > c)//第一生长阶段和第三生长阶段对比
{
if (a > b)//第一生长阶段和第二生长阶段对比
{
return a;
}
else
{
return b;
}
}
else
{
if (b > c)//第二生长阶段和第三生长阶段对比
{
return b;
}
else
{
return c;
}
}
}
int main()
{
long long N = 0;
cin >> N;
for (long long i = 1; i <= N; i++)
{
cout << TallestBush(i, 2 * (N - i), 2 * (i - 1)) << endl;
}
return 0;
}
运行结果:
PS:看到这里了,码字不易,给个一键三连鼓励一下吧!有不足或者错误之处欢迎在评论区指出!