首页 > 其他分享 >7-4 分寝室(c语言)

7-4 分寝室(c语言)

时间:2023-10-29 22:22:05浏览次数:36  
标签:女生 语言 int 寝室 n0 每间 人数

目录

目录

题目

学校新建了宿舍楼,共有 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

相关文章

  • 无涯教程-C语言 - 程序结构
    在研究C编程语言的基本构建块之前,让我们看一下C程序结构,以便在以后的章节中将其作为参考。示例代码让我们看一个简单的代码,该代码将打印"HelloLearnfk"一词-#include<stdio.h>intmain(){/*我是注释*/printf("Hello,Learnfk!\n");return0;}让我们......
  • B站C语言第五-六课——分支与循环语句
    1,分支语句#include<stdio.h>intmain(){ intage=100; if(age<18) printf("未成年\n"); elseif(age>=18&&age<28) printf("青年\n"); elseif(age>=28&&age<50) printf("壮年\n"); else......
  • 无涯教程-C语言 - 简介
    C是一种通用的编程语言,广泛用于系统软件与应用软件的开发。于1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇与肯·汤普逊,以B语言为基础,在贝尔实验室设计、开发出来。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐,成为最近25......
  • EDA工具使用+GIT操作+python编程+C语言编程+Riscv相关+TCL操作
    EDA工具使用Verdi覆盖率转网页urg-full64-dirsimv.vdbVerdi加载sessionverdi-ssrsessionFileVcs分部编译额外选项-partcomp:自动分块编译。-fastpartcomp:使用多核计算系统并行部分编译。-pcmakeprof:查看每部分编译占用的时间,方便对时间更久的进行拆分。-partc......
  • C语言运行库及glibc介绍
    C语言运行库任何一个C程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。当然,它还理应包括各种标准库函数的实现。这样的一个代码集合称之为运行时库(RuntimeLibrary)。而C语言的运行库,即被称为C......
  • c语言代码练习41
    问:实现在另一个数组中查找子字符串#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<assert.h>#include<string.h>intmain(){char*p1="abcdefgdef";char*p2="def";char*ret=strstr(p1,p2);if(r......
  • C语言笔记1
    标识符命名规则:1>标识名只能由字母、数字、下划线组成;2>不能以数字开头(只能以字母或下划线开头);3>不能与系统关键字冲突;C语言语法规定:变量要定义在当前代码的最前面extern声明外部符号局部变量的作用域是变量所在的局部范围全局变量的作用域是整个工程    ......
  • aardio语言
    https://www.aardio.com/ aardio专注于桌面软件开发,体积仅6.5MB,提供了大量开源的标准库、扩展库-这些库基本都是由纯aardio代码实现,涉及到了桌面编程的方方面面。aardio中的所有库基本都是由作者一个人编写,所以拥有良好的一致性。aardio一直保持活跃更新,有时一日数更,详......
  • fc大语言模型部署+本地知识库
      FCInvokeStartRequestId:930989fb-8910-400d-b981-1de87e89a3e3Info:@serverless-cd/engine:0.0.51,linux-x64,node-v14.19.2plugin@serverless-cd/checkouthasbeeninstalledplugin@serverless-cd/s-setuphasbeeninstalledplugin@serverless-cd/s-d......
  • C语言项目——简易版贪吃蛇
    使用工具CLion2022前期准备导入第三方库Easyx,详细教程=>在CLion、Dev-C++或Code::Blocks下面配置EasyX(2023-7-23更新)-CodeBus运行效果代码实现/**1.定义蛇结构*2.定义食物结构*3.游戏初始化*4.蛇行进*5.按键控制(方向,暂停)*6.吃食物*7.死亡判......