学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0 位、男生 n1 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。
现请你写程序完成寝室的自动分配。分配规则如下:
- 男女生不能混住;
- 不允许单人住一间寝室;
- 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;
- 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。
输入格式:
输入在一行中给出 3 个正整数 n0、n1、n,分别对应女生人数、男生人数、寝室数。数字间以空格分隔,均不超过 105。
输出格式:
在一行中顺序输出女生和男生被分配的寝室数量,其间以 1 个空格分隔。行首尾不得有多余空格。
如果有解,题目保证解是唯一的。如果无解,则在一行中输出No Solution
。输入样例 1:
24 60 10
输出样例 1:
4 6
注意:输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);或女生 8 间(都是 3 人间)、男生 2 间(都是 30 人间)。但因为人数差都大于 4 而不被采用。
输入样例 2:
29 30 10
输出样例 2:
No Solution
题解:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n0, n1, n;
cin>>n0>>n1>>n;
int girl_room;
int boy_room;
int cha; //人数差
map<int, int> M; //(人数差,女生房间数)
bool hasResult = false; //是否有解
for(int i=1;i<=n-1;i++){
girl_room = i;
boy_room = n - i;
// if(n0 % girl_room != 0 || n1 % boy_room != 0){
// continue;
// }
if (n0 % girl_room != 0 || n0 / girl_room <= 1 || n1 % boy_room != 0 || n1 / boy_room <= 1) {
continue;
}
//满足:
//不允许单人住一间寝室
//每间寝室入住的人数都必须相同
cha = abs((n0 / girl_room) - (n1 / boy_room));
M[cha] = girl_room;
hasResult = true;
}
if(hasResult){
auto it = M.begin(); //升序 第一个最小差值
cout<<it->second<<" "<<n - it->second;
}
else{
cout<<"No Solution";
}
return 0;
}
#include<bits/stdc++.h> using namespace std; int main(){ int n0, n1, n; cin>>n0>>n1>>n; int girl_room; int boy_room; int cha; //人数差 map<int, int> M; //(人数差,女生房间数) bool hasResult = false; //是否有解 for(int i=1;i<=n-1;i++){ girl_room = i; boy_room = n - i; if(n0 % girl_room != 0 || n1 % boy_room != 0){ continue; } cha = abs((n0 / girl_room) - (n1 / boy_room)); M[cha] = girl_room; hasResult = true; } if(hasResult){ auto it = M.begin(); //升序 第一个最小差值 cout<<it->second<<" "<<n - it->second; } else{ cout<<"No Solution"; } return 0; }
一开始是这个代码,注意循环里的if判断,导致一直有个样例点过不去扣1分。重新看代码逻辑和题目一直没找到是什么问题,把题目喂给AI,终于满分,可惜自己没找出来,对比了一下,就是if判断那里的问题。
审题:发现是分配规则第二条:不允许单人住一间寝室;没有判断
复习
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n0, n1, n;
cin>>n0>>n1>>n;
int girl_room;
int boy_room;
set<int> s;
map<int,int> M;
int cha;
for(int i=1;i<=n;i++){
girl_room = i;
boy_room = n - i;
if(n0%girl_room==0 && n1%boy_room==0){
if(n0/girl_room!=1&&n1/boy_room!=1){
cha = abs(n0/girl_room-n1/boy_room);
s.insert(cha);
M[cha] = girl_room;
}
}
}
if(!s.empty()){
cout<<M[*s.begin()]<<" "<<n-M[*s.begin()];
}
else cout<<"No Solution";
return 0;
}
遇到的问题提示是浮点错误,查看代码发现分房间的时候,从i=1~n,没注意当i=n时,男生宿舍为0,修改为i=1~n-1.
改进
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n0, n1, n;
cin>>n0>>n1>>n;
int girl_room;
int boy_room;
map<int,int> M;
int cha;
for(int i=1;i<=n-1;i++){
girl_room = i;
boy_room = n - i;
if(n0%girl_room==0 && n1%boy_room==0){
if(n0/girl_room!=1&&n1/boy_room!=1){
cha = abs(n0/girl_room-n1/boy_room);
M[cha] = girl_room;
}
}
}
if(!M.empty()){
cout<<M.begin()->second<<" "<<n-M.begin()->second;
}
else cout<<"No Solution";
return 0;
}