zltzlt 发表于 2020-2-20 21:26:13

Python:每日一题 336

今天的题目:

假设你是建造寺庙的建筑师。寺庙的柱子是由木头制成,每根柱子必须是一节完整的木头而且不能是被连接得到的。

给出 len(woods) 段具有不同长度的木头。你的寺庙有 m 根高度严格相同的柱子。求寺庙的最大高度。

示例 1:

输入:m = 3, woods =
输出:2
解释:选择长度为 2 的木头并且长度为 4 的木头被分为两段长度为 2 的木头。
示例 2:

输入:m = 3, woods =
输出:3
解释:长度为 10 的木头分为 3 段长度为 3 的木头和一根长度为 1 的木头。

{:10_298:}欢迎大家一起答题!{:10_298:}

zltzlt 发表于 2020-2-25 15:24:58

大家会超时的输入数据:

fan1993423 发表于 2020-2-20 21:40:43

程序员秒变建筑师,用代码修房子{:10_256:}

fan1993423 发表于 2020-2-20 21:49:06

一个账号 发表于 2020-2-20 21:38
这样行不行:

看清楚题意,不能拼接,你这个只有2个长度4的木头,别人要求3个木头才行

fan1993423 发表于 2020-2-20 22:15:51

本帖最后由 fan1993423 于 2020-2-20 22:30 编辑

from bisect import bisect
def fun336(m,woods):
    if not len(woods):return 0
    elif m==1:return max(woods)
    woods.sort()
    return max(woods[-1]//m,woods,woods[-1]//(m-1))-1])
这下看还有没有问题

wcshds 发表于 2020-2-20 22:22:31

如果給m = 3, woods = 是不是就無解

fan1993423 发表于 2020-2-20 22:25:16

wcshds 发表于 2020-2-20 22:22
如果給m = 3, woods = 是不是就無解

就是3塞

ruokang 发表于 2020-2-20 22:30:21

def f336(woods, m):
    max_hight = sum(woods) // m
    hight = max_hight
    while (hight != 0):
      num = 0
      for wood in woods:
            num += wood // hight
      if num >= m:
            break
      else:
            hight -= 1
    return hight

m = 3
woods =
print(f336(woods, m))

不知道有没有问题,测试结果是对的
我不知道怎么弄成代码框的样子

fan1993423 发表于 2020-2-20 22:34:50

这道题可以增加难度,给出len(woods)段可能有相同长度的木头

546623863 发表于 2020-2-20 22:40:52

def fun336(m : int, woods : list):
    woods.sort(reverse = True)
    Max = 1
    for i in range(1,woods+1):
      num = 0
      for each in woods:
            if(each >= i):
                num += (each // i)
                if(num >= m):
                  Max = i
                  break
            else:
                return Max
    return Max

目前么得其他思路,只有这个比较蠢的

拉了盏灯 发表于 2020-2-20 22:54:03

本帖最后由 拉了盏灯 于 2020-2-20 23:02 编辑

如果把木头劈成10/3还能高点,
def fc336(m,woods):
        for i in range(max(woods),0,-1):
                if m<=woods.count(i):
                        return i
                elif m <= len( if e//i != 0 or e==i for h in *(e//i)]):
                        return i
        return 0

糕糕 发表于 2020-2-20 22:57:18

大家的答案都看不懂,这个需要学到哪一步才能写出来呀

塔利班 发表于 2020-2-20 23:00:18

def f336(m,woods):
    if not woods:
      return 0
    n=max(max(woods)//m,1)
    while sum(e//n for e in woods)>=m:
      n+=1
    return n-1
暂时没想到别的

ouyunfu 发表于 2020-2-21 00:28:12

def f336(woods:list,m:int)->int:
    h=sum(woods)//m
    while True:
      n=0
      for i in woods:
            n+=i//h
      if n<m:
            h=h-1
      else:
            return h
print(f336(,3))
print(f336(,3))

whosyourdaddy 发表于 2020-2-21 00:55:02

def func336(m,woods):
    woods.sort()
    length = 1
    result = 0
    while length < woods[-1]:
      num = 0
      for each in woods:
            num += each // length
      if num >= m:
            result = length
      length += 1
    return result

scwcha 发表于 2020-2-21 08:54:27

看不懂啊,有没有简单一点的题?

一个账号 发表于 2020-2-21 12:36:15

糕糕 发表于 2020-2-20 22:57
大家的答案都看不懂,这个需要学到哪一步才能写出来呀

我也是,他们的算法我都看不懂{:10_266:}

TJBEST 发表于 2020-2-21 14:49:02

看了三遍才看懂题{:5_104:} ,不过难度不大
def fun336(m,woods):
    SortedWoods = sorted(woods)
    SortedWoods.reverse()
   
    M = len(woods)
    Count = 0
    MaxPossible = SortedWoods
    for temp in range(MaxPossible,0,-1):
      for eachwood in SortedWoods:
            if eachwood < temp:
                break
            else:
                Count += eachwood // temp
                if Count >= m:
                  return temp
                else:
                  pass
      Count = 0
    return 0

w932861108 发表于 2020-2-21 16:20:02

一个账号 发表于 2020-2-20 21:38
这样行不行:

不行,不能拼接,没有3根长度4的木头

我爱学习. 发表于 2020-2-21 16:52:45

哈哈想了半天没想出正常的解法,因为这个有点复杂,他可能会出现【5,60,100】这样的情况,这就不单单是一个木头切开就行了,它可以取100的两截木头,60的一截木头,所以就只好笨笨的从最大的高度开始试......只是这样只能是整数高度的。
def fun(number,woods):
    woods.sort(reverse=True)#从大到小排列
    for hight in range(woods,woods[-1],-1):
      num=0   #第几根木头
      wood_copy=woods[:]
      for i in range(0,number):   #试试是否能凑满number根指定高度(hight)的木头
            if hight > wood_copy:
                if num == len(woods)-1 or hight>wood_copy:   #凑不齐,跳出循环,换下一个hight
                  break
                else:
                  num+=1
            wood_copy-=hight
      else:#木头凑齐了
            return hight




print(fun(3,))

liuaihua1984 发表于 2020-2-21 21:15:30

先把列表中最小的值,赋给最终结果;然后将列表中各个值,对刚才结果加1,分别求地板除后再求和,如果求和值大于等于列表的长度,就将其值赋给最终结果,否则舍弃;重复第二步直到列表中最大值。
缺点是求出来的结果是整数米,如果是小数呢?
页: [1] 2 3
查看完整版本: Python:每日一题 336