【天梯赛】L1-095 分寝室

简介: 输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);同时,每间女寝人数必须都一样,每间男寝人数必须都一样,也就是女生总人数对女寝数取模为0,男生总人数对男寝数取模为0。输入在一行中给出 3 个正整数 n0​、n1​、n,分别对应女生人数、男生人数、寝室数。按题意模拟,因为知道总寝室数为n,所以可以从1~n-1暴力枚举女寝 i 的数量,那么男寝的数量则为 c-i。

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

相关文章
|
4月前
|
存储
【天梯赛】L2-042 老板的作息表
新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了? 本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。
36 5
L1-079 天梯赛的善良 (20 分)
L1-079 天梯赛的善良 (20 分)
215 0
7-7 天梯赛的善良 (20 分)
7-7 天梯赛的善良 (20 分)
281 0
|
存储 算法 容器
天梯赛二阶题——L2-015 互评成绩(25 分)
学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。
366 0
天梯赛二阶题——L2-015 互评成绩(25 分)
试题历届真题时间显示【第十二届】【省赛】【B组】(C++)
题目分析: 1.首先,输入的是毫秒,我们要先把它转化为秒:
217 0
试题历届真题时间显示【第十二届】【省赛】【B组】(C++)
|
算法 编译器 C语言
试题 历届真题 四平方和【第七届】【省赛】【B组】
四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。
188 0
试题 历届真题 四平方和【第七届】【省赛】【B组】
|
编译器 C语言 C++
试题 历届真题 交换瓶子【第七届】【省赛】【B组】
有N个瓶子,编号 1 ~ N,放在架子上。   比如有5个瓶子:   2 1 3 5 4   要求每次拿起2个瓶子,交换它们的位置。   经过若干次后,使得瓶子的序号为:   1 2 3 4 5   对于这么简单的情况,显然,至少需要交换2次就可以复位。   如果瓶子更多呢?你可以通过编程来解决。
167 0
试题 历届真题 交换瓶子【第七届】【省赛】【B组】