closer0412 2023-10-08 10:25 采纳率: 100%
浏览 9
已结题

小木棍问题11111

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 5050。

现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

  • 写回答

1条回答 默认 最新

  • 梦幻精灵_cq 2023-10-08 11:56
    关注
    • 前面的回答,“算法”设计是错误的。当我觉得不太妥当,搜索csdn,才看到题目样例,原来木棍原有长度是可以小于50的,被没有样例的题目带偏。
      经过摸索,感觉找到了比较优的“算法”:

      img

    代码

    #!/sur/bin/nve python
    # coding: utf-8
    
    def findLong(lis):
        count = sum(lis)
        factors = [i for i in range(1, int(count/min(lis))+1) if (not count%i) and count/i >= max(lis)]
        return count/factors[-1]
        
    
    if __name__ == '__main__':
        text = '''
    9
    5 2 1 5 2 1 5 2 1'''
        text2 = '''
    5
    2 2 2 2 2'''
        text3 = '''
    7
    6 8 1 2 5 2 9'''
        print(findLong(list(map(float, text.split('\n')[-1].split()))))
    
    


    先前的不妥题解——

    • 由题目可知,木棍的原长最小值是大于50的。
      由此已知,可得基本算法:算出输入木棍的总长度,再从51长度度开始遍历,找到最小整除于总长度数值的整数,即是原本木棍的根数,遍历到的当前数值就是木棍原有最小长度值。
      (题目描述没有言明原有木棍长度是整型,据题意,应该是整型。我这里默认是整型设计算法。如果是浮点型,以我目前的功底,还真没办法求解。😋)

    • 在代码实现“算法”时,才发现我前边儿的想法,是多么可笑😋😋整型“怎么合理哩?!”😁😁
      修正后的代码运行效果截屏图片

      img


      img

    代码

    #!/sur/bin/nve python
    # coding: utf-8
    
    def recount(nums):
        nums = tuple(map(float, nums))
        count = sum(nums)
        
        if count < 50 or max(nums) > 50 :
            print(' 输入错误!'.center(35, '~'))
            exit()
        
        n = count//50
        count %= 50
        
        return n, 50+count/n
    
    if __name__ == '__main__':
        result = recount(input(f"\n输入所有小木棍长度(如5 8 4.5 32.95 42):\n\n{'':>6}_").strip().split())
        print(f"\n输出:\n\n{f'原有{result[0]:.0f}{result[-1]:.2f}木棍':~^35}")
    
    

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 创建了问题 10月8日