PTA 分寝室问题

问题描述:

        学校新建了宿舍楼,共有 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"。

伪代码:

  1. 从输入中读取三个整数a、b和n。
  2. 初始化变量a1、b1为-1,mn为较大的数1000000,用于记录最小的差值。
  3. 使用循环从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。
  4. 判断a1和b1是否仍为初始值-1,如果是,则输出"No Solution",否则输出a1和b1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值