修建灌木/找规律

文章讨论了一种关于树修剪问题的解决策略,通过模拟修剪过程和运用数学思想来计算每棵树的最大生长高度。代码示例展示了两种方法,一是双重循环模拟修剪过程,二是直接根据树的位置计算最大生长高度。

题解:

初步思路:模拟

模拟呗,来回两趟,用两个数组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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值