问题描述:
学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0 位、男生 n1 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。
现请你写程序完成寝室的自动分配。分配规则如下:
- 男女生不能混住;
- 不允许单人住一间寝室;
- 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;
- 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。
- 注意:输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);或女生 8 间(都是 3 人间)、男生 2 间(都是 30 人间)。但因为人数差都大于 4 而不被采用。
代码:
a, b, n = map(int, input().split())
a1, b1, mn = -1, -1, 1000000
for i in range(1, n):
j = n - i
if a != i and a % i == 0 and b % j == 0 and b != j:
aa = a // i
bb = b // j
res = abs(aa - bb)
if mn > res:
a1 = i
b1 = j
mn = res
if a1 == -1 and b1 == -1:
print("No Solution")
else:
print(a1, b1)
思路:该代码通过遍历n的所有可能取值,计算a能整除i、b能整除j的情况下,a和b的商之差的绝对值,找出最小的差值及其对应的a1和b1,并输出结果。如果不存在满足条件的a1和b1,则输出"No Solution"。
伪代码:
- 从输入中读取三个整数a、b和n。
- 初始化变量a1、b1为-1,mn为较大的数1000000,用于记录最小的差值。
- 使用循环从1遍历到n-1: a. 计算j = n - i。 b. 如果a不等于i且a能整除i,且b能整除j且b不等于j,则就执行以下操作:
- 计算aa = a // i,bb = b // j,得到a和b的商。
- 计算差值res = |aa - bb|。
- 如果当前差值res小于mn,则更新a1、b1和mn。
- 判断a1和b1是否仍为初始值-1,如果是,则输出"No Solution",否则输出a1和b1。