小C的糖果分配问题 | 豆包MarsCode AI刷题

46 阅读2分钟

一、题目解析

 

问题描述

小C有一堆糖果,总共有n颗。她需要将糖果分给小朋友们,每个小朋友的糖果数量必须在l到r之间。她想知道,在满足这些条件的前提下,最少可以分给多少个小朋友,最多可以分给多少个小朋友。如果糖果无法正好分完,返回-1。

测试样例

样例1:

输入:n = 10,l = 2,r = 3

输出:[4, 5]

样例2:

输入:n = 7,l = 3,r = 5

输出:[2, 2]

样例3:

输入:n = 8,l = 1,r = 4

输出:[2, 8]

 

问题分析

小C需要将总共n颗糖果分给小朋友,每个小朋友分得的糖果数量必须在[l, r]范围内。问题是要找到满足条件的最少和最多小朋友数量,且糖果必须正好分完。如果无法满足条件,返回-1。

解题思路

1、计算最少人数(min_friends)。假设每个小朋友都拿到最多的糖果r,最少人数的计算方法是将糖果总数n除以r并向上取整。

2、计算最多人数(max_friends)。假设每个小朋友都只拿到1颗糖果,最多人数就是将糖果总数n除以1并向下取整。

3、边界检查。如果最少人数大于最多人数则说明无法满足条件,直接返回-1。检查最少人数时,如果分配后总糖果数少于n则返回-1.检查最多人数时,如果分配后总糖果数多余n,也返回-1。

 

代码实现

import math

 

def solution(n: int, l: int, r: int) -> list:

    # 最少小朋友数

    min_friends = math.ceil(n / r)

    # 最大小朋友数

    max_friends = n // l

    if min_friends>max_friends:

        return [-1]

    if min_friends * r < n or max_friends * l > n:

        return [-1]

    return [min_friends, max_friends]

 

二、知识总结

·math.ceil()用于向上取整,将小数部分向上进位到整数;// 用于向下取整。

·最优化思想:在计算最小人数时尽量让每个小朋友分多,在计算最多人数时尽量让每个小朋友分少。

 

三、学习计划

对于错题的使用,我们可以记录并分析错误的类型,然后重新审视题目,确保理解所有的要求之后从零开始重新写代码,以防止陷入原有错误的思维惯性。

四、工具使用

可以利用豆包中的AI给出的提示进行代码的编写,能提供一定的灵感。还可以利用网上已有的学习资源进行算法的学习。