
题解:
初步思路:模拟
模拟呗,来回两趟,用两个数组nums和dp分别记录每颗树实时的长度和最高长度
既然是来回两趟,那么最外层for循环肯定是for k in range(2)表示来回两趟的修建
里面呢?首先肯定是从左往右剪,那么for i in range(n)
其次,早晨到傍晚,数目得长高吧,所以for j in range(n):nums[j]+=1
长高完之后,第i棵树得被剪成0吧,所以nums[i]=0
而且你还得统计最高长度吧,所以for m in range(n):dp[m]=max(dp[m],nums[m])
这是正向的,下面是反向的:
for i in range(n-1,-1,-1)下面的就和正向的一样了
喜提40分及格代码,shit!!!!!
n=int(input())
nums=[0]*n
dp=[0]*n
for k in range(2):
for i in range(n):
for j in range(n):
nums[j]+=1
nums[i]=0
for m in range(n):
if dp[m]<nums[m]:
dp[m]=nums[m]
for i in range(n-1,-1,-1):
for j in range(n):
nums[j]+=1
nums[i]=0
for m in range(n):
if dp[m]<nums[m]:
dp[m]=nums[m]
for i in range(n):
print(dp[i])
最佳思路还是找规律:
用数学思想来做就是,一棵树的最大生长高度应该是第一次被剪到的时候再到第二次被剪到的时候这个中间时间的生长高度。其实也就是这颗树距离边界距离的二倍。因为碰到边界后会返回刚好是双倍距离这个路程用来生长。
import os
import sys
# 请在此输入您的代码
n=int(input())
for i in range(n):
print(max(2*(n-1-i),2*i))