暴力破解之随机数

放苹果

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

全部评论
为什么必须 += ,你之前不用+=,用了什么代替然后出问题了?
点赞 回复 分享
发布于 2022-10-01 16:26 广东

相关推荐

点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务