分寝室l1

发布时间 2023-04-25 21:15:36作者: 框框大吃的肉白菜
L1-7 分寝室
分数 20
作者 陈越
单位 浙江大学

学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0 位、男生 n1 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。
现请你写程序完成寝室的自动分配。分配规则如下:

  • 男女生不能混住;
  • 不允许单人住一间寝室;
  • 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;
  • 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。

输入格式:

输入在一行中给出 3 个正整数 n0n1n,分别对应女生人数、男生人数、寝室数。数字间以空格分隔,均不超过 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,m=1000000000,p,q,f=0;//注意M要开大
    cin>>n0>>n1>>n;
    for(int i=2;i<=n0;i++){//两个循环会超时,i表示每个女生宿舍人数
        if(!(n0%i))//女生可以住满
            if(!(n1%(n-n0/i)))//男生可以住满
            {
                int a,b;
                a=n0/i;//女生宿舍数目
                b=n-a;//男生宿舍数目
            
                if(n1/b==1)continue;//不允许一人住一间
                f=1;
                if(fabs(i-n1/b)<m){m=fabs(i-n1/b);p=a;q=b;f=1;}
            }
        }
    
    if(f)
    cout<<p<<' '<<q;
    else cout<<"No Solution";
}
 是简单的,就当一个教训吧