解题思路:
这个题我的思路是找规律:(可以尝试自己写一下)
N=3时:
//每棵树最大高度是4 2 4(标红的)
//1 2 3 这里是序号,下面是每天对应的高度
//0 1 1 从最左边开始
//1 0 2
//2 1 0 ***剪到了最右边
//3 2 0 接着从右边向左边剪
//4 0 1
//0 1 2 剪到了最左边
//0 2 3
//1 0 4
//2 1 0 ***这里又剪到了最右边,可以看到标“***”的两行高度一致且都是从左向右剪,故可知往后的顺序会再这两个“***”序列之间循环,故不赘述
我们再多列举几个,相关说明同第一个例子
当N=4时:
//6 4 4 6 最大高度 偶数
//1 2 3 4 序号 两边2*(n-1)
//0 1 1 1 依次2*(n-2),2*(n-3)……
//1 0 2 2
//2 1 0 3
//3 2 1 0 ***
//4 3 2 0
//5 4 0 1
//6 0 1 2
//0 1 2 3
//0 2 3 4
//1 0 4 5
//2 1 0 6
//3 2 1 0 ***
当N=5时:
//8 6 4 6 8 最大高度 奇数
//1 2 3 4 5 序号 最两边 2*(n-1)
//0 1 1 1 1 依次向内 2*(n-2) 2*(n-3) ……
//1 0 2 2 2
//2 1 0 3 3
//3 2 1 0 4
//4 3 2 1 0 ***
//5 4 3 2 0
//6 5 4 0 1
//7 6 0 1 2
//8 0 1 2 3
//0 1 2 3 4
//0 2 3 4 5
//1 0 4 5 6
//2 1 0 6 7
//3 2 1 0 8
//4 3 2 1 0 ***
可知,无论偶数奇数,其规律都是从两边依次向内2*(n-1),2*(n-2)……
唯一要分奇偶的地方在于中间位置的输出
看代码实现
参考代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int N;
cin>>N;
int arr[N];
//偶数 用 1 2 3 4 5 6 这6个数字举例,最大高度依次为10 8 6 6 8 10
if(N%2==0){
for(int i=1;i<=N/2;i++){ // 序号为1 2 3的已经写好了10 8 6
arr[i]=2*(N-i);
}
for(int j=N;j>N/2;j--){ //倒着来
arr[j]=arr[N-j+1]; //arr[6]=arr[1] , arr[5]=arr[2] ……
}
}
//奇数 用1 2 3 4 5这五个数字举例 最大高度依次为8 6 4 6 8
else{
for(int i=1;i<=N/2+1;i++){ //序号为1 2 3的已经写好了8 6 4
arr[i]=2*(N-i); //这里特殊的一点是N/2+1才是最中间的序号,只有一个,只写一遍
}
for(int j=N;j>(N/2)+1;j--){ //倒着来,最中间的不用写了,所以跳过就行
arr[j]=arr[N-j+1]; //arr[5]=arr[1],arr[4]=arr[2]
}
}
for(int i=1;i<=N;i++){
cout<<arr[i]<<" ";
}
return 0;
}
0.0分
0 人评分