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