Leetcode 2591.将钱分给最多的儿童

给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。

你需要按照如下规则分配:

所有的钱都必须被分配。
每个儿童至少获得 1 美元。
没有人获得 4 美元。
请你按照上述规则分配金钱,并返回 最多 有多少个儿童获得 恰好 8 美元。如果没有任何分配方案,返回 -1 。

贪心算法,试着在满足每人至少1美元的前提下,尽可能地多分8美元,同时避开有人拿到4美元的情况。
可以分情况讨论,先排除所有例外情况:

  1. 当钱不够每个儿童分得1美元时,一定无解,return -1;
  2. 当有人可能会分得4美元时,首先需要明确,最多有且只有一人分到4美元,否则均存在调整空间。会阻碍的情况仅有:一人拿到4美元,剩余所有人均8美元;此时有两人需要重新分配,拿到8美元的儿童最多为children-2;
  3. 如果钱太多了,以至于每个儿童都拿到8美元了还有富余,则让一个儿童拿走剩下的钱,拿到8美元的儿童最多为children-1;
  4. 以上已经排除外所有特殊情况,在一般情况下,由于每人需要提前分得1美元,用贪心能计算可知,还能拿到7美元的儿童数最多为:(money-children)/7。

Java实现代码如下:

class Solution {//分情况讨论,将意外情况先排除
    public int distMoney(int money, int children) {
    	//钱不够每人1美元且至少有一人8美元
    	if(money<children) {
    		return -1;
    	}
    	
    	//钱太多了,最后一人超过8美元
    	else if(children*8<money) {
    		return children-1;
    	}
    	
    	//最后一人不足8美元,且刚好等于4,让最后两人随意分配
    	else if(money-8*(children-1)==4) {
    		return children-2;
    	}
    	
    	//剩下的情况都满足,可达8美元的人数为 (money-children)/7
    	else return (money-children)/7;
    }
}
  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

maplesea7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值