2591. 将钱分给最多的儿童
题意
- 分钱
- 求最多的可以拿到 8 8 8 美元的孩子的数量
解法 分类讨论
4 美元的设定很讨厌。但是,只有当 children = 1 && money == 4
的时候,才会出现不能分配的情况。
分类讨论:
- m o n e y < c h i l d r e n money < children money<children:不能分配,因为每个孩子最少要获得 1 美元。
-
m
o
n
e
y
>
c
h
i
l
d
r
e
n
money > children
money>children:
- 首先计算最多可以获得 8 美元的孩子数
cnt = min(children, money / 8)
,然后再来分配别的孩子,此时,money -= cnt * 8
,children -= cnt
:- 如果
m
o
n
e
y
money
money 还有多,但是
c
h
i
l
d
r
e
n
children
children 没有了,则从
c
n
t
cnt
cnt 中取出一个孩子来,把剩下的
m
o
n
e
y
money
money 都给他,那么
cnt--
; - 如果
m
o
n
e
y
money
money 没有了,但是
c
h
i
l
d
r
e
n
children
children 还有多,那么一直从
c
n
t
cnt
cnt 中取出孩子,直到
m
o
n
e
y
money
money 足够分配
c
h
i
l
d
r
e
n
children
children:
- 那么 最后都会归结到
m
o
n
e
y
money
money 有多,孩子也有多 这个情况。而此时,只有
children = 1 && money == 4
这种情况无法分配,其余情况都可以分配,所以cnt--
。
- 那么 最后都会归结到
m
o
n
e
y
money
money 有多,孩子也有多 这个情况。而此时,只有
- 如果
m
o
n
e
y
money
money 还有多,但是
c
h
i
l
d
r
e
n
children
children 没有了,则从
c
n
t
cnt
cnt 中取出一个孩子来,把剩下的
m
o
n
e
y
money
money 都给他,那么
- 首先计算最多可以获得 8 美元的孩子数
class Solution {
public:
int distMoney(int money, int children) {
if(money < children) return -1;
int cnt = min(children, money / 8);
money -= cnt * 8;
children -= cnt;
if(money > 0 && children == 0)
cnt--;
while(cnt >= 0 && money < children)
{
cnt--;
money += 8;
children++;
}
// 够每人一美元,看有没有4
if(money == 4 && children == 1)
cnt--;
return cnt;
}
};
WA哭了 :)
复杂度
时间复杂度:
O
(
1
)
O(1)
O(1)
空间复杂度:
O
(
1
)
O(1)
O(1)