【问题描述】 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌 木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。 灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的 早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
【输入格式】 一个正整数 N ,含义如题面所述。
【输出格式】 输出 N 行,每行一个整数,第行表示从左到右第 i 棵树最高能长到多高。
【样例输入】 3
【样例输出】 4 2 4
【评测用例规模与约定】 对于 30% 的数据,N ≤ 10. 对于 100% 的数据,1 < N ≤ 10000.
看懂图像了吗?第一次我们从第一个灌木剪到最后一个灌木,回来的时候从第n-1个灌木剪到第一个灌木,然后从第2个灌木剪到最后一个完成循环。
#include <iostream>
using namespace std;
long long data1[100000];
long long max1[100000];
long long n;
long long index1 = 1;
int main(int argc, char *argv[])
{
cin >> n;
for (int i = 1; i <= 2; i++)
{
if(i==2)
{
index1 = 2; //第2次循环从2开始
}
while (index1 <= n)
{
for (int i = 1; i <= n; i++)
{
data1[i] = data1[i] + 1;
}
if (data1[index1] > max1[index1]) //如果剪到的那个灌木高度,比那个灌木的最高高度还高,就更新一下最高高度。
{
max1[index1] = data1[index1];
}
data1[index1] = 0;
index1++;
}
if(i==2) //第2次开始从2到n,后面不用再回来了。
{
break;
}
//此时index1为n+1
index1 = index1 - 2; //第一次循环回来从n-1开始
while (index1 >= 1)
{
for (int i = 1; i <= n; i++)
{
data1[i] = data1[i] + 1;
}
if (data1[index1] > max1[index1])
{
max1[index1] = data1[index1];
}
data1[index1] = 0;
index1--;
}
}
for (int i = 1; i <= n; i++)
{
cout << max1[i] << endl;
}
return 0;
}