LeetCode每日一题

这是一个关于分配金钱的问题,给定总金额和儿童数量,目标是让尽可能多的儿童得到8美元,同时确保每个儿童至少得到1美元且没有人得到4美元。代码实现了一个解决方案,首先判断分配可行性,然后进行分配,最后处理剩余金钱以满足条件。如果无法满足所有条件,则返回-1。
摘要由CSDN通过智能技术生成

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

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

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

先上代码:

int distMoney(int money, int children){
	int i = 0;
	//判断是否有分配方案
	if (money < children)
		return -1;
	else if (money < children + 7)
		return 0;
	//进行分配
	money -= children;
	while (children != 0 && money >= 7)
	{
		money -= 7;
		i++;
		children--;
	}
	//判断是否有儿童收到4个苹果,并且判断在此基础上如何分配
	if (money == 3 && children <=1||children==0&&money!=0)
	{
		return i - 1;
	}
	return i;
}

个人思路:1.先判断是否有分配方案

                2.进行分配

                3.判断是否有儿童收到4个金钱,并且在此基础上讨论如何分配

一、判断是否有分配方案

if (money < children)
		return -1;
	else if (money < children + 7)
		return 0;

如果金钱数少于儿童个数,则一定会有儿童收不到钱。

如果money<children+7,则意味着在每个儿童都收到至少一元时,必定没有儿童收到8元,则返回0。

二、进行分配

money -= children;
	while (children != 0 && money >= 7)
	{
		money -= 7;
		i++;
		children--;
	}

先确保每个儿童都有钱拿;再进入循环,每当一个儿童再次收到7元时就意味着他有了8元,该儿童符合要求,所以i++;孩子数减少一个。当孩子数量为0或剩下的钱不够再让一个孩子符合要求时,则意味着分配已经大致完成。

此时跳出循环的情形有两种:

1.每个孩子都拿到了8元,并且可能还有多余的钱没分出去。

2.剩下的钱不够让剩下的孩子符合要求.

而在此基础上加入“不能有儿童收到4元钱”这一条件。情形二可以再次分成三种结果:

2.(1)剩下的钱不够3元——返回i;

2.(2)剩下的钱够3元——儿童数量足够大,使剩下儿童中没人够到4元

2.(3)剩下的钱够3元——儿童数量很小——必须有人达到4元

三、分配结果。

if (money == 3 && children <=1||children==0&&money!=0)
	{
		return i - 1;
	}
	return i;

而在此基础上加入“不能有儿童收到4元钱”这一条件。

        情形1可分为两种结果:

1.(1)刚好分完钱——皆大欢喜——返回i;

1.(2)有多余的钱——必须有人承受多余的钱而因此不满足条件——返回i-1;

        情形二可以再次分成三种结果:

2.(1)剩下的钱不够3元——返回i;

2.(2)剩下的钱够3元——儿童数量足够大,使剩下儿童中没人够到4元——返回i;

2.(3)剩下的钱够3元——儿童数量很小——必须有人达到4元——返回i-1;

统计结果可能性写成代码即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值