【力扣每日一题】2023.9.22 将钱分给最多的儿童

目录

题目:

示例:

分析:

代码:


题目:

【力扣每日一题】2023.9.22 将钱分给最多的儿童_第1张图片

示例:

【力扣每日一题】2023.9.22 将钱分给最多的儿童_第2张图片

分析:

给我们一笔钱和一些小朋友,要我们把这些钱分完不能剩,并且不能有小朋友被分到4元以及每个人至少分到1元,问我们能给多少个小朋友正好发8元。

这道题让我挺意外的,因为明明是个简单题,但是截止我做题的时候通过率只有二十多,比大多数题都要低,所以这题还是值得说一说的。

这道题主要是需要分类讨论,首先条件有每个小孩子都至少要分1元,因此如果钱数比小朋友更少,那么无法分配,返回-1。

题目要我们尽可能多的让小朋友分到8元,因此如果钱数大于小朋友的数量乘8,那么最优策略是

给所有小朋友8元,剩下的钱都塞给某个小朋友,这样分到8元的小朋友数量就是小朋友数量-1。

两个极端情况分析完,剩下就是不能给小朋友分4元。

我们需要尽可能多的分8元,因此我们的策略是先给每个人分1元拿个低保,然后一个个的塞钱直到分到了8元,再接着给下一个小朋友塞钱。

如果我们分完钱的时候,刚好给小朋友分到4元,那么我们需要避免这种情况,因此我们可以把4元拿回来1元,塞到另一个只分到1元的小朋友手上。如果其他没有拿1元的小朋友了,就把这1元塞给拿到8元的某个小朋友手上,此时拿到8元的小朋友数量就是原本小朋友数量-2。

其他情况我们可以直接模拟,给每个小朋友都先分1元,然后还能给几个小朋友分7元,写成表达式就是(m-n)/7,刚刚上面给小朋友分到4元但是其他还有分1元的小朋友的情况也可以这么算出来。

【力扣每日一题】2023.9.22 将钱分给最多的儿童_第3张图片

代码:

class Solution {
public:
    int distMoney(int money, int children) {
        //不够分一元
        if(moneychildren*8) return children-1;
        //特殊情况,最后1人分到4美元,改成其中一个分8元的改成分到>8,最后一人<4
        if(money==(children-1)*8+4) return children-2;
        //给每人发一元之后再看看能给多少人再发7元
        return (money-children)/7;
    }
};

你可能感兴趣的:(力扣每日一题,leetcode,算法,c++,数据结构)