鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: zltzlt

[已解决]Python:每日一题 336

[复制链接]
 楼主| 发表于 2020-2-25 15:17:14 | 显示全部楼层
TJBEST 发表于 2020-2-21 14:49
看了三遍才看懂题 ,不过难度不大

会超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-25 15:19:19 | 显示全部楼层
我爱学习. 发表于 2020-2-21 16:52
哈哈想了半天没想出正常的解法,因为这个有点复杂,他可能会出现【5,60,100】这样的情况,这就不单单是一 ...

输入 m = 3, woods = [2, 3, 4] 没有返回值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-25 15:19:50 | 显示全部楼层
kinkon 发表于 2020-2-21 23:24
想了好久才理清思路,感觉有些难度

会超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-25 15:20:28 | 显示全部楼层

返回值不能是小数哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-25 15:21:21 | 显示全部楼层
阴阳神万物主 发表于 2020-2-22 00:48
暴力破解,暂未想到更便捷的方案。

会超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-25 15:24:58 | 显示全部楼层
大家会超时的输入数据:

testdata.zip (180.29 KB, 下载次数: 8)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-25 20:09:02 | 显示全部楼层
厉害了,哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 18:35:27 From FishC Mobile | 显示全部楼层
本帖最后由 kinkon 于 2020-3-3 18:14 编辑

终于弄了个分钟能跑完超长数据的准确程序,累死宝宝了...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 11:43:56 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-5 09:15 编辑

解题如下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 09:10:06 | 显示全部楼层
引用了外部模块,解楼主给的超长数据,自己测试,时长8秒
  1. import numpy as np
  2. def p336(m,woods):
  3.     woods1 = np.sort(np.array(woods))[-m:][::-1]
  4.     lmin, pmax = max(woods) // m, sum(woods) // m
  5.     if woods1.size <= 1:
  6.         return lmin
  7.     if m == 1:
  8.         return max(woods)        
  9.     nwoods = np.unique(woods1)[::-1]
  10.     t = k = rec = 0
  11.     while k < nwoods.size:        
  12.         t += 1                           
  13.         tmp, c = nwoods[k]//t, 0        
  14.         if lmin <= tmp <= pmax:
  15.             if tmp > rec:               
  16.                 c = np.sum(woods1//tmp)              
  17.             else:
  18.                 k += 1
  19.                 t = 0                        
  20.             if c >= m:
  21.                 rec = max(rec, tmp)               
  22.                 k += 1
  23.                 t = 0
  24.         else:
  25.             if t == m:
  26.                 k += 1  
  27.     return rec
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 09:15:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 kinkon 于 2020-4-18 09:49 编辑

经历一段学习,终于能按要求完成,二分法
  1. def f336(m,woods):   
  2.     if m <= 0 or not woods:
  3.         return 0
  4.     left, right = min(woods), sum(woods) // m   
  5.     nds = lambda mid: sum(wood // mid for wood in woods) >= m
  6.     while left + 1 < right:
  7.         mid = left + (right - left)//2        
  8.         if nds(mid):
  9.             left = mid
  10.         else:
  11.             right = mid
  12.     if nds(right):
  13.         return right
  14.     elif nds(left):
  15.         return left
  16.     return 0
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 13:18:14 | 显示全部楼层
kinkon 发表于 2020-4-18 09:15
经历一段学习,终于能按要求完成,二分法

251 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 11:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表