修剪灌木
爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式 :
一个正整数 N ,含义如题面所述。
输出格式 :
输出 N 行,每行一个整数,第i行表示从左到右第 i 棵树最高能长到多高。
样例输入 :
3
样例输出 :
4 2 4
这是一道关于数组的模拟题
建立一个数组初值为 1 , 嵌套两个循环,第一个循环代表天数,第二个循环对每一天的树木长度变化作出改变。
分析测试案例 : 输入 3 颗树木
第一天晚 1 1 1 修剪以后 0 1 1
第二天晚 1 2 2 修剪以后 1 0 2
第三天晚 2 1 3 修剪以后 2 1 0
第四天晚 3 2 1 修剪以后 3 0 1
第五天晚 4 1 2 修剪以后 0 1 2
第六天晚 1 2 3 修剪以后 1 0 3
第七天晚 2 1 4 修剪以后 2 1 0
第八天晚 3 2 1 修剪以后 3 0 1
通过分析发现,将范围缩小至来回一个半循环,就能找出每个树木对应的最大长度,为了保险所以我们将天数设置为 3 * n 天。
在每个天数循环里,我们对实际的tree数组进行相应操作即可。
那么还有一个问题是,当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。
这里我的解决方法是,将每次要置零的树木下标都存放在一个index数组中, 通过这个index数组来找出对应天数置零的数组下标。
最后解决每个树木最大值问题,建立一个max数组,实时更新每个树木的长度变化,每当树木出现最大值,就更新max数组。
最后附上代码 :
/*
* @Name: hjc Email : jchuan_Hou@163.com
* @Data: 2022年4月10日09:09:35
* @Describe: LQ_CB_D 修剪树木
*/
#include <iostream>
using namespace std;
int index[100001];
int n;
int main()
{
cin >> n;
int * tree = new int[n];
int * max = new int[n];
//初始化下标数组
int flag = 0;
int j = 0;
for (int i = 0; i < 3 * n; i++)
{
index[i] = j;
if(flag == 0)
{
j++;
}
else if (flag == 1)
{
j--;
}
if (j == n - 1)
{
flag = 1;
}
if (j == 0)
{
flag = 0;
}
}
//初始化max数组
for (int i = 0; i < n; i++)
{
max[i] = 0;
}
/* for (int i = 0; i < 2 * n + 1; i++)
{
cout << index[i] << " ";
}
cout << endl;*/
for (int i = 0; i < n; i++)
{
tree[i] = 1;//初始化为 1
}
for (int i = 0, j = 0; i < 3 * n; i++)
{
tree[index[i]] = 0;
for (int t = 0; t < n; t++)
{
tree[t] = tree[t] + 1;
if (max[t] < tree[t]) max[t] = tree[t];
}
}
for (int i = 0; i < n; i++)
{
cout << max[i] << endl;
}
return 0;
}