1. 题目描述
学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0 位、男生 n1 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。
现请你写程序完成寝室的自动分配。分配规则如下:
男女生不能混住;
不允许单人住一间寝室;
对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;
在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。输入格式:
输出格式:
在一行中顺序输出女生和男生被分配的寝室数量,其间以 1 个空格分隔。行首尾不得有多余空格。
如果有解,题目保证解是唯一的。如果无解,则在一行中输出 No Solution。
输入样例 1:
24 60 10
输出样例 1:
4 6
输入样例 2:
29 30 10
输出样例 2:
No Solution
2. 思路分析
按题意模拟,因为知道总寝室数为n,所以可以从1~n-1暴力枚举女寝 i 的数量,那么男寝的数量则为 c-i。
要注意题目给出的条件,不允许单人住一间,也就是说每一间寝室的人数必须>1。同时,每间女寝人数必须都一样,每间男寝人数必须都一样,也就是女生总人数对女寝数取模为0,男生总人数对男寝数取模为0。
为了让两种性别每间寝室入住的人数差最小,这里我采用了“打擂台”的做法,先定义一个比较大的数字mi(这里我让mi=100000,也可以更大),然后 每当男女每间寝室入住的人数差的绝对值(因为不知道是每间男寝人多还是每间女寝人多)比 mi小,就更新mi。同时记录此时的男寝数和女寝数。
3. 代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int a,b,c; cin>>a>>b>>c;
int mi=100000,x=0,y=0;
for(int i=1;i<c;i++){
int t1=a%i,t2=b%(c-i);
int s1=a/i,s2=b/(c-i);
if(a%i==0&&b%(c-i)==0&&a/i>1&&b/(c-i)>1){
if(abs(s1-s2)<mi){
x=i,y=c-i;
mi=min(mi,abs(a/i-b/(c-i)));
}
}
}
if(mi==100000) cout<<"No Solution"<<endl;
else cout<<x<<" "<<y<<endl;
return 0;
}