40元红包发10个人,每个人最多发6块解决方案。

本文介绍了一个用于随机分配固定金额到指定数量的人身上的算法,并确保每人分得的金额不超过设定的上限。通过递归的方式重新分配金额直到符合要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Divide(10,40,6);
 
function Divide(p,m,a){
    /*传入人数,总金额,单人上限*/
    var arr=[];
    nm=m*100;
    na=a*100;
    /*乘100,便于运算*/
    l=p;
    /*每次遍历后剩余人数*/
    for(i=0;i<p-1;i++){
        l--;
        arr[i]=roll(nm,l);
        /*传入剩余金额及人数*/
        nm-=arr[i];
        /*剩余金额*/
    }
    arr[p-1]=nm;
    /*最后一个人不用分*/
    if(arr[p-1]>na){
        return Divide(p,m,a);
    }
    /*最后一个人如超过上限,重新分*/
    return arr.map(function(v,i,arr){
        return v=v/100;
    });
    /*分好了,每个数重新除以100,输出结果*/
 
    /*定义随机函数,传入剩余金钱和人数*/
    function roll(o,l){
        var b=o-l;
        /*每个人至少分1分钱*/
        var Max=Math.min(na,b);
        return Math.ceil(Math.random()*Max);
    }
}

任务描述 本关任务:编写一个将红包金额按一定数量随机分配的小程序。 问题分析 既然要模拟抢红包,那么我们需要解决以下问题: 抢到的红包金额是看运气的,所以一定需要公平; 红包金额最大不能超过 200 每个分到的红包最小不能少于 1 分钱,红包的最小单位是分; 我们需要避免前面分配的红包比重过大,导致后面的红包过小。 实现流程 红包金额限制:我们先定义两个常量,用于设置红包的最大额度与最小额度,单位这里我们统一用分; 判断红包金额是否合法(即红包最大金额不得超过 200,最小金额不得小于 0.1): 在分配红包之前判断红包总金额以及每个领到的红包金额是否合法; 在分配红包之后判断剩下的领到的红包金额是否合法。 为了避免红包分配过大,我们需要设置每个包最大值为剩余红包平均数(剩余红包金额 / 剩余红包数量)的 2 倍,红包最小值依然为 0.1 分,当设置的每个包的最大值大于剩余红包总金额时,此时每个包的最大值为红包总金额; 开始分配红包时,如果剩余红包数量为 1,则直接返回剩余红包总金额; 如果红包数量不为 1,则我们在每个包的最大值与最小值之间随机产生一个整数,这里我们的产生随机数的算法公式为: ((int)Math.rint(Math.random() * (每个包的最大值 - 每个包的最小值) + 每个包的最小值)) % 每个包的最大值 + 1; 在分配红包之后判断剩下的领到的红包金额是否合法,如果不合法,我们需要重新产生分配方案,在重新产生分配方案的时候,我们需要确定一个事情,是产生的红包过大还是过小,如果红包过大,下次就随机一个最小值到本次红包金额之间的一个红包,如果红包金额过小,我们就产生一个此次红包金额到最大值之间的一个红包; 依次执行,最后将分配到的红包金额放入一个 List 集合中。 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中完成随机分配红包的功能,具体要求如下: RedPacketUtil 类定义了一个 splitRedPackets(int money, int count) 的方法,方法返回值为 List 集合,传入的两个参数分别为红包总金额(单位:分)和红包数量,将分配好的红包放入 List 集合,最后将该集合返回; 如果初始金额大于 200 每个包的值小于 1 分,输出:“红包金额不合法”,之后退出程序。 测试说明 平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。 测试输入: 100 10 第一次输入的值为红包总金额:100 分; 第二次输入的值为红包数量:10 份; 预期输出: [2, 17, 6, 9, 3, 8, 18, 18, 2, 17] 红包送成功 开始你的任务吧,祝你成功! 下面是题目框架import java.util.ArrayList; import java.util.List; public class RedPacketUtil { // 请在下面的Begin-End之间编写正确的代码 /********** Begin **********/ // 最小红包额度 // 最大红包额度 // 每个红包最大是平均值的倍数 /** * 参数 money * 参数 count * 返回值 List * 功能: 拆分红包 */ public List<Integer> splitRedPackets(int money, int count) { } /** * 参数 money * 参数 minS 最小值 * 参数 maxS 最大值 * 返回值 int * 功能 获取每个包的随机金额 */ private int random(int money, int minS, int maxS, int count) { } /********** End **********/ }
最新发布
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值