目录
目录题目
学校新建了宿舍楼,共有 n 间寝室。等待分配的学生中,有女生 n0 位、男生 n1 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去,最后不能有寝室留空。
现请你写程序完成寝室的自动分配。分配规则如下:
- 男女生不能混住;
- 不允许单人住一间寝室;
- 对每种性别的学生,每间寝室入住的人数都必须相同;例如不能出现一部分寝室住 2 位女生,一部分寝室住 3 位女生的情况。但女生寝室都是 2 人一间,男生寝室都是 3 人一间,则是允许的;
- 在有多种分配方案满足前面三项要求的情况下,要求两种性别每间寝室入住的人数差最小。
输入格式:
输入在一行中给出 3 个正整数 n0、n1、n,分别对应女生人数、男生人数、寝室数。数字间以空格分隔,均不超过 10^5。
输出格式:
在一行中顺序输出女生和男生被分配的寝室数量,其间以 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<stdio.h>
#include<stdlib.h>
int main(){
int n0,n1,n;
scanf("%d%d%d",&n0,&n1,&n);
int g=0,b=0,min=100;//女生男生宿舍数,和女生男生每间宿舍人数差
int i=2,j=n1/(n-n0/i);//每间宿舍人数
/*
错误原因1:没考虑女生每间人数太少会使分配房间多于n间,则j<0直接跳过下面的for循环。
*/
for(;j>1;i++)//不允许单人住一间
/*
错误原因2:循环上限设置错误,每间宿舍女生人数i越大,女生宿舍越少,男生宿舍越多,男生每间人数越少 1<i<n0;1<j<n1;0<n0<n;0<n1<n;
*/
{
j=n1/(n-n0/i);
if(n0%i!=0||n1%j!=0)//每间入住的人数不同
continue;
else if(n0/i+n1/j==n)//分配正确
{
if(abs(i-j)<min)//比较男女宿舍人数差
{
g=n0/i;
b=n1/j;
}
}
}
if(g==0||b==0)
printf("No Solution\n");
else
printf("%d %d\n",g,b);
return 0;
}
运行结果
错误分析
- 错误原因1
- 没考虑女生每间人数太少会使分配房间多于n间,则j<0直接跳过下面的for循环。所以运行结果是‘No Solution’。
- 错误原因2
- 循环上限设置错误,每间宿舍女生人数i越大,女生宿舍越少,男生宿舍越多,男生每间人数越少。导致运行一旦进入for循环,则进入无限循环。
应满足条件1<i<n0;1<j<n1;0<n0<n;0<n1<n;。
第二次错误代码
第二次代码:在第一次代码的基础上改进
#include<stdio.h>
#include<stdlib.h>
int main() {
int n0, n1, n;
scanf_s("%d%d%d", &n0, &n1, &n);
int g = 0, b = 0, min = 100;//错误1:min设置太小,min=100000
int i = n0/n+1, j = n1 / (n - n0 / i);
for (;i<n0; i++)
{
j = n1 / (n - n0 / i);
printf("每间人数:女i=%d 男j=%d\n", i, j);
if (n0 % i != 0 || n1 % j != 0)//每间入住的人数不同
{
printf("人数不均!\n");
continue;
}
else if (n0 / i + n1 / j == n)//分配正确
{
printf("分配成功!\n人数差:%d\n",abs(i-j));
if (abs(i - j) < min)//比较男女宿舍人数差
{
g = n0 / i;
b = n1 / j;
min=abs(i-j);//错误2:为什么加不加这行代码,答案没什么变化?
}
}
}
if (g == 0 || b == 0)
printf("No Solution\n");
else
printf("%d %d\n", g, b);
return 0;
}
运行结果:
错误分析
- 错误原因1
- 男女生每间宿舍人数min初始设置太小,不利于后面的比较
abs(i-j)<min
,虽然不明白为什么min=100还不够大,但是设置成100000后,原本没通过的测试点通过了。 - 错误原因2
- 不明白为什么加不加这行代码
min=abs(i-j)
,通过的测试点是一样的。
最终结果
还是有两个测试点没通过,下次再慢慢研究。
标签:女生,语言,int,寝室,n0,每间,人数 From: https://www.cnblogs.com/wa2211lq/p/17796123.html