L1-095 分寝室 (分数20)

题目描述

学校一共有n间寝室,每间寝室是个无底洞,可以装无数人现在学校有\(n_0\)个女生 , \(n_1\)个男生 , 要求把所有寝室都分配学生,不能留空

现有如下分配规则:

  • 男女生不能混住;

  • 不允许单人住一间寝室;

  • 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;

  • 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。

输入格式

在一行出给出\(n_0\)\(n_1\)\(n\) ,分别表示女生人数,男生人数,以及寝室数量。

输出格式

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

输入样例

24 60 10

输出样例

4 6

解题思路

❌️ : 我刚开始看到这题的时候,第一个想到的就是最大公约数,我看这个答案,像啊,很像啊,于是我踏上了找数学规律这条不归路

✅️ : 实际上就是设未知数解方程的过程 , 只不过现在是在代码里体现, 已知寝室总数 , 只需枚举女生分配的寝室数 ,男生的寝室数就能表达
我听到了洞悉的回响,我闻到了未知数的清香

题解✅️

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int fm,m,r;
    cin>>fm>>m>>r;
    int nv,nan;
    int mn = 1e8;
    //暴力枚举,女生从1开始选起
    for(int i = 1 ; i < r; i++)
        {
            int j = r-i;
            if(fm%i == 0 && m%j == 0 && i + j <= r && fm/i > 1 && m/j > 1)
            {
                if(abs(fm/i - m/j) < mn)
                {
                    mn = abs(fm/i - m/j);
                    nv = i , nan = j;
                }
            }
        }
    if(mn != 1e8) cout<<nv<<" "<<nan;
    else cout<<"No Solution";
}
posted @ 2026-03-10 15:52  shuiwangrenjia  阅读(1)  评论(0)    收藏  举报