妈呀编程有点难


私信TA

用户名:dotcpp0727535

访问量:42

签 名:

等  级
排  名 9010
经  验 1127
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
这个题我的思路是找规律:(可以尝试自己写一下)

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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区