2023年05月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

news2025/1/14 1:15:16

在这里插入图片描述

第1题:问题求解

给定一个正整数N,求最小的M满足比N大且M与N的二进制表示中有相同数目的1。
举个例子,假如给定N为78,二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。
时间限制:1000
内存限制:65536
输入
输入若干行,每行一个数N(1 ≤ N ≤ 1000000),如果这行为0表示输入结束。
输出
对于每个N,输出对应的M。
样例输入
1
2
3
4
78
0
样例输出
2
4
5
8
83

这个问题可以使用搜索剪枝技术来解决。我们可以从给定的整数N开始,逐个尝试比N大的整数,直到找到一个满足条件的整数M。在每次尝试时,我们需要判断M的二进制表示中是否包含与N相同数量的1。如果找到了满足条件的M,则输出M作为答案。

下面是一个使用搜索剪枝技术的示例代码:

#include <stdio.h>

// 计算一个整数的二进制表示中1的数量
int countOnes(int num) {
    int count = 0;
    while (num) {
        count += num & 1;
        num >>= 1;
    }
    return count;
}

// 判断一个整数的二进制表示中1的数量是否与给定的count相等
int hasSameNumberOfOnes(int num, int count) {
    return countOnes(num) == count;
}

// 搜索比N大且二进制表示中包含count个1的整数
int findNextNumber(int N, int count) {
    int num = N + 1;
    while (!hasSameNumberOfOnes(num, count)) {
        num++;
    }
    return num;
}

int main() {
    int N;
    while (scanf("%d", &N) == 1 && N != 0) {
        int count = countOnes(N);
        int M = findNextNumber(N, count);
        printf("%d\n", M);
    }
    return 0;
}

这段代码定义了三个函数:countOnes用于计算一个整数的二进制表示中1的数量,hasSameNumberOfOnes用于判断一个整数的二进制表示中1的数量是否与给定的count相等,findNextNumber用于搜索比N大且二进制表示中包含count个1的整数。

main函数中,首先读取输入的整数N,然后通过调用countOnes函数计算N的二进制表示中1的数量。接下来,调用findNextNumber函数找到比N大且二进制表示中包含相同数量的1的整数M。最后,输出M作为答案。

你可以将题目给出的示例输入复制到代码中进行测试。

第2题:算24

给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。 比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
时间限制:6000
内存限制:65536
输入
输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
输出
对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
样例输入
5 5 5 1
1 1 4 2
0 0 0 0
样例输出
YES
NO

这个问题可以使用搜索剪枝技术来解决。我们可以尝试对给定的4个数字进行各种运算和排列组合,判断是否存在一种方式使得表达式的结果等于24。在每次尝试时,我们可以使用递归来遍历所有可能的运算和数字排列,并进行剪枝操作以提高效率。

下面是一个使用搜索剪枝技术的示例代码:

#include <stdio.h>
#include <stdbool.h>

#define TARGET 24
#define EPSILON 1e-6

bool canGet24(double nums[], int count) {
    if (count == 1) {
        return fabs(nums[0] - TARGET) < EPSILON;
    }

    for (int i = 0; i < count; i++) {
        for (int j = 0; j < count; j++) {
            if (i == j) {
                continue;
            }

            double a = nums[i];
            double b = nums[j];

            double nextNums[count - 1];
            int nextCount = 0;

            for (int k = 0; k < count; k++) {
                if (k != i && k != j) {
                    nextNums[nextCount++] = nums[k];
                }
            }

            nextNums[nextCount] = a + b;
            if (canGet24(nextNums, nextCount + 1)) {
                return true;
            }

            nextNums[nextCount] = a - b;
            if (canGet24(nextNums, nextCount + 1)) {
                return true;
            }

            nextNums[nextCount] = b - a;
            if (canGet24(nextNums, nextCount + 1)) {
                return true;
            }

            nextNums[nextCount] = a * b;
            if (canGet24(nextNums, nextCount + 1)) {
                return true;
            }

            if (b != 0) {
                nextNums[nextCount] = a / b;
                if (canGet24(nextNums, nextCount + 1)) {
                    return true;
                }
            }

            if (a != 0) {
                nextNums[nextCount] = b / a;
                if (canGet24(nextNums, nextCount + 1)) {
                    return true;
                }
            }
        }
    }

    return false;
}

int main() {
    double nums[4];
    while (scanf("%lf %lf %lf %lf", &nums[0], &nums[1], &nums[2], &nums[3]) == 4) {
        if (nums[0] == 0 && nums[1] == 0 && nums[2] == 0 && nums[3] == 0) {
            break;
        }

        if (canGet24(nums, 4)) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }

    return 0;
}

这段代码定义了一个canGet24函数,用于判断给定的4个数字是否可以通过运算得到24。在函数内部,使用两层循环遍历所有可能的数字组合,并针对每个组合进行各种运算操作。在每次运算后,将得到的结果与24进行比较,如果结果接近24(使用浮点数比较,并定义了一个极小的误差范围EPSILON),则递归调用canGet24函数继续判断剩余的数字是否可以得到24。如果最终找到一种方式使得结果等于24,返回true;否则,返回false

main函数中,首先读取输入的4个数字,然后通过调用canGet24函数判断是否可以得到24,并输出相应的结果。

你可以将题目给出的示例输入复制到代码中进行测试。

第3题:忍者道具

忍者道具有很多种,苦无,飞镖,震爆弹。L君热衷于收集忍者道具,现在他有N个道具,每个道具的重量分别是C1、C2…CN。现在他想把这N个道具装到载重量为W的工具包里,请问他最少需要多少个工具包?
时间限制:1000
内存限制:65536
输入
第一行包含两个用空格隔开的整数,N和W。 接下来N行每行一个整数,其中第i+1行的整数表示第i个道具的重量Ci。
输出
输出一个整数,最少需要多少个工具包。
样例输入
5 1996
1
2
1994
12
29
样例输出
2
提示
对于100%的数据,1<=N<=18,1<=Ci<=W<=10^8。

这个问题可以使用贪心算法来解决。我们可以按照道具的重量从大到小进行排序,然后依次将道具放入工具包中,直到当前道具无法放入为止。然后再取下一个道具放入工具包,重复这个过程,直到所有道具都被放入工具包中。最后统计使用的工具包数量即可。

下面是一个使用贪心算法的示例代码:

#include <stdio.h>
#include <stdlib.h>

// 比较函数,用于排序
int compare(const void* a, const void* b) {
    return *(int*)b - *(int*)a;
}

int minToolkits(int weights[], int N, int W) {
    qsort(weights, N, sizeof(int), compare); // 按照重量从大到小排序

    int count = 0; // 工具包数量
    int currentWeight = 0; // 当前工具包中的总重量

    for (int i = 0; i < N; i++) {
        if (currentWeight + weights[i] > W) {
            // 当前道具无法放入当前工具包,需要使用新的工具包
            count++;
            currentWeight = 0;
        }

        currentWeight += weights[i];
    }

    // 最后一个工具包可能未达到最大载重,但仍然需要计算在内
    if (currentWeight > 0) {
        count++;
    }

    return count;
}

int main() {
    int N, W;
    scanf("%d %d", &N, &W);

    int weights[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &weights[i]);
    }

    int result = minToolkits(weights, N, W);
    printf("%d\n", result);

    return 0;
}

这段代码定义了一个minToolkits函数,用于计算最少需要多少个工具包来装载道具。在函数内部,首先使用qsort函数对道具的重量进行排序,按照从大到小的顺序。然后,使用贪心策略,依次将道具放入工具包中,如果当前道具无法放入当前工具包,则使用新的工具包。最后,统计使用的工具包数量并返回。

main函数中,首先读取输入的N和W,然后读取每个道具的重量,并将它们存储在weights数组中。接下来,调用minToolkits函数计算最少需要的工具包数量,并输出结果。

你可以将题目给出的示例输入复制到代码中进行测试。

第4题:泳池

小C在一个排水系统不太好的学校上学。又是一个下雨天,学校里高低不平积了很多水。小C突发奇想:如果大雨一直下,多久以后我可以在学校里游泳呢?
学校是 N x N 的坐标方格 grid 中,每一个方格的值 grid(i,j)表示在位置 (i,j) 的高度。现在开始下雨了。当时间为 t 时,此时雨水导致方格中任意位置的水位为 t 。你可以从一个方格游向四周相邻的任意一个方格,但是前提是此时水位必须同时淹没这两个方格。假定小C的游动是不耗时的。
现在小C从坐标方格的左上(0,0)出发。最少耗时多久他才能到达坐标方格的右下平台 (N-1, N-1)?
时间限制:1000
内存限制:65536
输入
第一行有一个整数N,以下是一个N*N的方阵,代表各处的高度。 输入范围: 2 ≤ N ≤ 300 0 ≤ Height ≤ 10000000
输出
输出一个整数,代表最少等待时间T
样例输入
样例输入1:
2
0 2
1 3
样例输入2:
5
0 1 2 3 4
24 23 22 21 5
12 13 14 15 16
11 17 18 19 20
10 9 8 7 6
样例输出
样例输出1:
3
样例输出2:
16
提示
样例1:时间为3时,才可以游向平台(1,1),此时水位为3。 样例2:时间为16时,水位为16,此时才能保证(0,0)和(4,4)是联通的(请自行找出一条通路)。

这个问题可以使用搜索剪枝技术来解决。我们可以使用深度优先搜索(DFS)来搜索所有可能的路径,并在搜索过程中进行剪枝,以减少搜索空间。

下面是一个使用搜索剪枝技术的示例代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_N 300

int N;
int grid[MAX_N][MAX_N];
int visited[MAX_N][MAX_N];

int minTime(int x, int y, int t) {
    if (x == N - 1 && y == N - 1) {
        return t;
    }

    visited[x][y] = 1;

    int min = -1;

    // 搜索上方
    if (x > 0 && !visited[x - 1][y] && grid[x - 1][y] >= t) {
        int time = minTime(x - 1, y, t + 1);
        if (time != -1 && (min == -1 || time < min)) {
            min = time;
        }
    }

    // 搜索下方
    if (x < N - 1 && !visited[x + 1][y] && grid[x + 1][y] >= t) {
        int time = minTime(x + 1, y, t + 1);
        if (time != -1 && (min == -1 || time < min)) {
            min = time;
        }
    }

    // 搜索左边
    if (y > 0 && !visited[x][y - 1] && grid[x][y - 1] >= t) {
        int time = minTime(x, y - 1, t + 1);
        if (time != -1 && (min == -1 || time < min)) {
            min = time;
        }
    }

    // 搜索右边
    if (y < N - 1 && !visited[x][y + 1] && grid[x][y + 1] >= t) {
        int time = minTime(x, y + 1, t + 1);
        if (time != -1 && (min == -1 || time < min)) {
            min = time;
        }
    }

    visited[x][y] = 0;

    return min;
}

int main() {
    scanf("%d", &N);

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            scanf("%d", &grid[i][j]);
            visited[i][j] = 0;
        }
    }

    int result = minTime(0, 0, 0);
    printf("%d\n", result);

    return 0;
}

这段代码定义了一个minTime函数,用于计算小C到达右下平台的最少等待时间。在函数内部,我们使用深度优先搜索(DFS)来搜索所有可能的路径。对于每个位置(x, y),我们判断是否可以从当前位置游向上、下、左、右四个方向,并将其未访问过且高度不低于当前时间的位置加入搜索路径中。递归地搜索下去,直到到达右下平台或者无法继续搜索。如果找到一条路径,我们记录下最小的等待时间。在搜索过程中,使用visited数组来标记已经访问过的位置,避免重复访问。

main函数中,首先读取输入的N和每个方格的高度,并将它们存储在grid数组中。然后,调用minTime函数计算最少等待时间,并输出结果。

你可以将题目给出的示例输入复制到代码中进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/961033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试之“支付功能”测试

01、测试思维 要分析测试点之前&#xff0c;我们先来梳理一下测试思维。总结来说&#xff0c;任何事物的测试思路都可以总结如下&#xff1a; 第一步&#xff1a;梳理产品的核心业务流程&#xff1a;明白这是个什么项目&#xff0c;实现了什么业务&#xff0c;以及是怎么实现…

三、定长内存池

三、定长内存池 我们知道申请内存使用的是malloc&#xff0c;malloc其实就是一个通用的大众货&#xff0c;什么场景下都可以使用&#xff0c;而什么场景下都可以用就意味着什么场景下都不会有很高的性能&#xff0c;下面我们就先来设计一个定长内存池作为一个开胃菜&#xff0…

全能图片转文字:多功能图片处理软件

全能图片转文字是一款支持将图片文件实时转换为文字的处理软件。该软件可以帮助用户快速地获取图片文件中的文字内容&#xff0c;减少人工摘录的时间和成本&#xff0c;同时具备图片转excel、智能配音及PDF编辑等其他热门功能&#xff0c;轻松满足办公、学习中的各类需求。支持…

基于costas环的载波同步系统matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................ I_Dataroun…

2001-2022年全国各区县最低工资数据

2001-2022年全国各区县最低工资数据 1、时间&#xff1a;2001-2022年 2、来源:人社部 3、指标&#xff1a;年份、行政区划代码、地区、所属省份、所属城市、经度、纬度、最低工资-每月、最低工资-小时 4、样本量&#xff1a;5.5万条 5、指标解释&#xff1a;最低工资标准是…

使用 Node-RED 构建 DolphinDB 低代码平台

前言 DolphinDB 是由浙江智臾科技有限公司研发的一款高性能分布式时序数据库&#xff0c;集成了功能强大的编程语言和高容量高速度的流数据分析系统&#xff0c;为海量结构化数据的快速存储、检索、分析及计算提供一站式解决方案。DolphinDB 数据库支持每秒百万级数据写入&…

Qt---对话框 事件处理 如何发布自己写的软件

目录 一、对话框 1.1 消息对话框&#xff08;QMessageBox&#xff09; 1> 消息对话框提供了一个模态的对话框&#xff0c;用来提示用户信息&#xff0c;或者询问用户问题并得到回答 2> 基于属性版本的API 3> 基于静态成员函数版本 4> 对话框案例 1、ui界面 …

天地图pc端显示正常,app不能显示

问题&#xff1a;天地图在pc端显示正常&#xff0c;但是app端不能显示 原因&#xff1a;天地图官网区分服务端key和客户端key 更换一下key就可以了 app端需要申请服务端key, pc端和h5使用客户端key

前端是leyui后端sqlserver和maraDB进行分页

项目场景&#xff1a; 前端是leyui后端sqlserver和maraDB进行分页,两种数据库在后端分页的不同写法 解决方案&#xff1a; 前端: 定义table,表格的格式在接口返回时进行创建,根据id进行绑定 <div class"layui-tab-item layui-show" style"padding-top: 10…

恒运资本:股票跌100%后怎么办?

在股票市场里&#xff0c;股票价格跌涨是日常的现象&#xff0c;有时候涨到令人惊喜&#xff0c;有时候却一路跌向谷底。股价跌到零的情况并不常见&#xff0c;可是&#xff0c;假如是跌了100%怎么办呢&#xff1f; 在探究该问题前&#xff0c;咱们需要了解股票跌100%是怎样的…

【Terraform学习】Terraform动态块基础操作(Terraform模块)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

微机原理 || 8253接口芯片知识点+4道经典例题+手写解题过程

&#xff08;二&#xff09;经典考题&#xff1a; 【例1】: 设8253端口地址为300H&#xff5e;303H&#xff0c;要求计数器2工作在方式5&#xff0c;二进制计数&#xff0c;CLK22MHz&#xff0c;OUT21KHz。试按上述要求完成8253的初始化。 【例2】&#xff1a;选择计数器0工…

【Postman】postman生成测试报告完整步骤(包含命令与newman安装教程链接)

文章目录 一、前提二、导出Postman脚本三、生成测试报告 一、前提 前提准备&#xff1a; 已安装好Newman 指引文章&#xff1a;Newman安装与环境配置完整版文章 Newman是一款基于nodejs开发的可以运行Postman脚本的工具&#xff0c;并可以生成测试报告。 二、导出Postman脚本…

探索UniApp分包

目录 什么是UniApp分包&#xff1f; UniApp分包的原理 优势 如何使用UniApp分包 1.manifest.json文件配置 2.静态图片资源分包注意事项 3.pages.json配置 结论 探索UniApp分包&#xff1a;优化移动应用性能与用户体验 在移动应用开发领域&#xff0c;性能和用户体验是至…

如何在Mac电脑上安装WeasyPrint:简单易懂的步骤

1. 安装homebrew 首先需要确保安装了homebrew&#xff0c;通过homebrew安装weasyprint可以将需要的库都安装好&#xff0c;比pip安装更简单快捷。 安装方法如下&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)&qu…

800V架构下,扁线电机该怎么“绕”?

800V高压平台下&#xff0c;整车电池系统&#xff0c;充电系统&#xff0c;电驱系统均要向高电压平台进行开发。电机作为三电系统中的核心&#xff0c;其效率表现直接影响了整车的性能。而在800V架构下&#xff0c;电机的设计与低压平台的设计也有所不同&#xff0c;要求电驱系…

使用多进程的方式改写聊天程序(有名管道)

目录 1、思路2 、步骤 1、思路 2 、步骤 步骤1&#xff1a;创建两个管道 makefifo fifo1 fifo2步骤2&#xff1a;编写talkA.c文件 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> #in…

Pandas实用技巧

首先我们需要先提前下载好示例数据集&#xff1a; drinksbycountry.csv : http://bit.ly/drinksbycountry imdbratings.csv : http://bit.ly/imdbratings chiporders.csv : http://bit.ly/chiporders smallstockers.csv : http://bit.ly/smallstocks kaggletrain.csv : htt…

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决 今天发现rt系统的adc有一个缺陷&#xff08;也可能是我移植的方法有问题&#xff0c;这就不得而知了&#xff01;&#xff09;&#xff0c;就是只能单次转换&#xff0c;事情是这样的&#xff1a; 我在stm32的RT-T…

中国人民大学与加拿大女王大学金融硕士项目——金融行业的你怎么能不知道?

虽然金融圈总是被内行各种吐槽&#xff0c;如工作时长久、内卷严重、做不完的报告、以及分析不完的数据等等&#xff0c;但不得不承认&#xff0c;金融行业的确给予了人实现财富自由的机会。人生的梦想与碎银几两同样重要。想要在金融圈混得更好就不能停下提升的脚步&#xff0…