L1-095 分寝室 坑点吐槽篇(很详细) C++

文章描述了一个编程问题,需要根据给定的女生和男生人数以及寝室总数,制定规则确保男女生分开住宿,且每间寝室人数相同。文章提供了输入输出样例,并强调了解题中的关键点和注意事项。

学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0​ 位、男生 n1​ 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。
现请你写程序完成寝室的自动分配。分配规则如下:

  • 男女生不能混住;
  • 不允许单人住一间寝室;
  • 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;
  • 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。

输入格式:

输入在一行中给出 3 个正整数 n0​、n1​、n,分别对应女生人数、男生人数、寝室数。数字间以空格分隔,均不超过 105。

输出格式:

在一行中顺序输出女生和男生被分配的寝室数量,其间以 1 个空格分隔。行首尾不得有多余空格。
如果有解,题目保证解是唯一的。如果无解,则在一行中输出 No Solution

输入样例 1:

24 60 10

输出样例 1:

4 6

注意:输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);或女生 8 间(都是 3 人间)、男生 2 间(都是 30 人间)。但因为人数差都大于 4 而不被采用。

输入样例 2:

29 30 10

输出样

### 关于PAT L1-095 寝室 测试4 的解决方案 对于给定的问题,解决的关键在于理解输入条件以及如何合理寝室以满足所有约束条件。具体来说: 当面对特定测试案例时,尤其是像测试4这样的情况,重要的是考虑边界条件和特殊情况。 #### 边界条件析 为了处理好这些特殊情形,在编写算法前应该先思考可能遇到的最大值、最小值以及其他极端状况下的数据布。例如,当女生人数`n0`或男生人数`n1`等于零时,意味着只有一种性别的学生需要安排住宿;又或者是总房间数不足以容纳所有人等异常场景[^1]。 #### Python 实现逻辑 基于上述规则实现了一个Python函数来计算并返回符合条件的结果。该方法通过遍历所有可行的组合方式找到最优解,并确保不会违反任何规定。以下是具体的代码实现: ```python def assign_rooms(n, n0, n1): result = "No Solution" for girls_per_room in range(2, n0 + 1): boys_per_room = (girls_per_room - 1) or float('inf') # 防止除以0 if n0 % girls_per_room == 0 and n1 != 0: girl_rooms_needed = n0 // girls_per_room for boy_ratio in reversed(range(girls_per_room)): if boy_ratio >= 2 and n1 % boy_ratio == 0: boy_rooms_needed = n1 // boy_ratio total_rooms_used = girl_rooms_needed + boy_rooms_needed if total_rooms_used <= n and abs(girls_per_room - boy_ratio) < abs(int(result.split()[0]) - int(result.split()[1])) or 'Solution' not in result: result = f"{girl_rooms_needed} {boy_rooms_needed}" return result.strip() ``` 此段代码尝试不同的女生每间房入住人数(`girls_per_room`),并通过调整男生每间房入住人数(`boys_per_room`)寻找最佳匹配方案。最终输出结果为两个整数——别代表女生和男生所需的寝室数量,中间用空格隔开。如果没有合适的配方案,则会输出"No Solution"[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

创业者-杨成淦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值