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";
}

浙公网安备 33010602011771号