暴力破解之随机数
放苹果
https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
有点像概率学和积分思想,一个固定区域 有固定的点,当你随机投入的点够多的时候,这个点就接近这个固定点。
求一个长方形里一条不规则曲线的积分:在长方形的边界范围内随机投入点数:先自己定义一个随机点的个数(根据概率性,随机个数越多最后数据越趋近与积分)total_points(65000)
然后用numpy.random.uniform(x,y) 或者random.randint(x,y) 来取total_points个随机数 在每次取一个随机数的时候,判断该随机数在不在不规则曲线范围内,在的话计入一个list。for i in totalpoints完了之后:
在对比len(list)与total_points 的占比即可从长方形的面积来得出不规则曲线的积分。
类比此题。 输入固定的盘子m和苹果数目n(即有边界),求苹果n放到盘子m里的方法总数,即有明确的规则f(n,m)。所以我们可以顶一个固定区域边界(即要随机的个数total_points):
这个total 即可以自己随意定一个大数比如说示例代码的(65000暴力尝试) ,也可自己根据边界和题目逻辑进行优化:
总结一句话就是,手动模拟苹果放入盘子 N次(N很大) 就能近似的得出所有情况。
import random
while True:
try:
num_list=list(map(int,input().split()))
m=num_list[0]
n=num_list[1]
result=[]
for _ in range(70000):
stack_d=[0]*n
apple=m
while apple>0:
for desk in range(n):
a=random.randint(0,apple)
stack_d[desk]+=a #注意此处必须+= ,因为可能出现range(n)遍历完还剩苹果的情况
apple-=a
if apple==0:
break
stack_d.sort()
if stack_d not in result:
result.append(stack_d)
print(len(result))
except:
break