knight618 最近的时间轴更新
knight618

knight618

V2EX 第 661214 号会员,加入于 2023-11-08 15:11:26 +08:00
knight618 最近回复了
6 天前
回复了 tenserG 创建的主题 算法 面试遇到怪题,大家有什么思路吗
思路就是默认每人一块,剩下的钱一块块的随机给一个人
import random

def main(m, n):
if m > n >0:
m_30 = m * 0.3
print("单人上限:", m_30)
if n-1+int(m*0.3) > m or m/n > m_30: # 判定平均分是否会超过 30%等乱七八糟的可能
return []

re_ = [1 for i in range(n)] # 默认每人一块
re_n = [i for i in range(n)] # 分钱团队
m -= n # 去掉默认的钱
while m > 0: # 奖池还有钱
random_n = random.choice(re_n) # 随机没有超过限额的人
re_[random_n] += 1 # 这个人多一块
if re_[random_n] > m_30: # 这个人超过了限额
re_[random_n] -= 1 # 这个人少一块
re_n.pop(re_n.index(random_n)) # 分钱团队删除这个人
continue # 继续分钱
m -= 1 # 奖池减少一块
return re_
elif m == n:
return [1 for i in range(n)]
else:
return []

if __name__ == "__main__":
s = 500 # 总奖金
r = 17 # 总人数
result = main(s, r)
if result:
print(result)
else:
print("No solution")
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3025 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 11ms · UTC 14:49 · PVG 22:49 · LAX 07:49 · JFK 10:49
Developed with CodeLauncher
♥ Do have faith in what you're doing.