PTA L1-095 分寝室 分数 20 C++(g++)

L1-095 分寝室 - 团体程序设计天梯赛-练习集 (pintia.cn)
题目链接↑ 详细要求请点击.

问题解析:

根据要求我们可以知道,分寝室它不让分单间,不让1人住一间,男寝室每间都只能住X人,女寝室每间都只能住Y人,而不能男寝室这间3人那间4人.

通过观察我们可以发现规律,即我们可以得出 男/女寝的极限人数,在题目给出的数据中:

24-女生人数 60-男生人数 10-总房间数

我们可以发现,女生每间寝室最多只能住8人(抛弃1人一间 与 24本身)

括号中,前者是规则限制,不能一人一间,后者是24人一间 那么房间余9,而男生人数60无法被9整除所以不满足条件.

因此,可以将穷尽结果的范围开始进一步缩小,通过计算2到8之间可以产生多少个“合理”(即符合条件的组合),再将这些组合进行判断即可得出结果. 代码如下:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main() {
    int a, b, c; // 女生人数/男生人数/寝室数
    cin >> a >> b >> c;
    int max = 0; // 女生寝室最多能住的人数
    for (int s = 2; s < a; s++) {
        if (a % s == 0) {
            max = s;
        }
    }
    vector<int>temp_a;// 女/男寝人数
    vector<int>temp_b;
    vector<int>temp_r;//人数差
    for (int i = 2; i <= max; i++) {
        if (a % i == 0 && b % (c - (a / i)) == 0) { //这是符合的条件
            int temp_c = b / (c - (a / i));
            if (temp_c > 0) { // 进一步确定,因为我们是以女生最大为起点,所以男生中可能会出现错误条件,即负数.
                temp_a.push_back(i); //存储符合条件下的女生/男生寝室人数
                temp_b.push_back(temp_c);
                if (i > temp_c) { // 绝对值也行,这样写是方便自己一眼能看懂,防止出现负数情况
                    temp_r.push_back(i - temp_c);
                }
                else {
                    temp_r.push_back(temp_c - i);
                }
            }
        }
    }
    if (temp_a.size() == 0) { // 容器内没东西,所以为无解
    cout << "No Solution" << endl;
    }
    else {
        int min_r = temp_r[0]; // 最小人数差
        int min_i = 0; // 对应的位置
        for (int i = 0; i < temp_r.size(); i++) { // 通过计算最小人数差 和记录它的位置 与下文的cout 对应的,到时候直接拿来输出就行,上文创建的三个一维数组它们是同体系的,位置通用,直接拿来用就行.
            if (min_r > temp_r[i]) {
                min_r = temp_r[i];
                min_i = i;
            }
        }
        cout << a / temp_a[min_i] << " " << b / temp_b[min_i] << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值