2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题

2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组部分真题和题解分享

文章目录

  • 蓝桥杯2023年第十四届省赛真题-平方差
    • 思路题解
  • 蓝桥杯2023年第十四届省赛真题-更小的数
    • 思路题解
  • 蓝桥杯2023年第十四届省赛真题-颜色平衡树
    • 思路题解
  • 蓝桥杯2023年第十四届省赛真题-买瓜
    • 思路题解

蓝桥杯2023年第十四届省赛真题-平方差

题目描述
给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 x = y2 − z2。
输入格式
输入一行包含两个整数 L, R,用一个空格分隔。
输出格式
输出一行包含一个整数满足题目给定条件的 x 的数量。
样例输入
1 5
样例输出
4
提示
1 = 12 − 02 ;
3 = 22 − 12 ;
4 = 22 − 02 ;
5 = 32 − 22 。
对于 40% 的评测用例,LR ≤ 5000 ;
对于所有评测用例,1 ≤ L ≤ R ≤ 109 。

思路题解

解题思路:

  • 规律:只有当x为奇数或4的倍数时才能拆分为两个数的平方差。
    注意事项:
  • 刚开始用c++写循环的时候,有一个样例会超时,故进一步寻找规律:F(X)=x/4+(x+1)/2,该式代表不大于x的满足条件的数的个数,用F®-F(L-1)即为L-R之间(大于等于L,小于等于R)满足条件的数的个数。
#include<iostream>
using namespace std;
int F(int x) {
    return x / 4 + (x + 1) / 2;//不大于x的满足条件的数的个数
}
int main() {
    int l = 0, r = 0;
    cin >> l >> r;
    cout << F(r)-F(l-1);
    return 0;
}

蓝桥杯2023年第十四届省赛真题-更小的数

题目描述
在这里插入图片描述
输入格式
输入一行包含一个长度为 n 的字符串表示 num(仅包含数字字符 0 ∼ 9),
从左至右下标依次为 0 ∼ n − 1。
输出格式
输出一行包含一个整数表示答案。
样例输入
210102
样例输出
8
提示
一共有 8 种不同的方案:
1)所选择的子串下标为 0 ∼ 1 ,反转后的 numnew = 120102 < 210102 ;
2)所选择的子串下标为 0 ∼ 2 ,反转后的 numnew = 012102 < 210102 ;
3)所选择的子串下标为 0 ∼ 3 ,反转后的 numnew = 101202 < 210102 ;
4)所选择的子串下标为 0 ∼ 4 ,反转后的 numnew = 010122 < 210102 ;
5)所选择的子串下标为 0 ∼ 5 ,反转后的 numnew = 201012 < 210102 ;
6)所选择的子串下标为 1 ∼ 2 ,反转后的 numnew = 201102 < 210102 ;
7)所选择的子串下标为 1 ∼ 4 ,反转后的 numnew = 201012 < 210102 ;
8)所选择的子串下标为 3 ∼ 4 ,反转后的 numnew = 210012 < 210102 ;

对于 20% 的评测用例,1 ≤ n ≤ 100 ;
对于 40% 的评测用例,1 ≤ n ≤ 1000 ;
对于所有评测用例,1 ≤ n ≤ 5000 。在这里插入图片描述

思路题解

解题思路:

中心思想:s[l] > s[r]则满足条件,答案的个数+1。

详细解释:考虑s的所有子串[l,r], l即left,是子串的起始下标,r即right是子串的末尾下标,判断s[l] 和 s[r]的大小关系:

  • 若s[l] > s[r]则该子串反转后,新串<原串,满足条件,答案数+1;

  • 若s[l] = s[r]则将子串区间[l,r]缩小为[l+1,r-1],再判断s[l+1]和s[r-1]的大小关系;

  • 若s[l] < s[r]则该子串反转后,新串>原串,不满足条件。

注意事项:

  • 注意l和r的取值范围(详见代码注释)。
#include<iostream>
#include<string>
using namespace std;
string s;
int F(int l, int r) {
    while (l < r) {
        if (s[l] > s[r])return 1;//如果s[l] > s[r],反转后满足条件 新字符串<原字符串。
        else if (s[l] == s[r]) { l++;r--; }//如果s[l] == s[r],两边同时缩小区间。
        else break;//如果s[l] < s[r],不用继续考虑,反转后一定不满足条件,直接退出循环
    }
    return 0;
}
int main(){
    cin >> s;
    int n = s.length();//n是字符串长度
    int ans = 0;//记录答案
    for (int l = 0;l <= n - 2;l++) {//l即left是子串的起始下标,从0开始到n-2(子串长度至少为2,最右侧的最小子串下标为[n-2,n-1],故l最多到n-2)
        for (int r = n - 1;r > l;r--) {//r即right是子串的末尾下标,从s的最末下标n-1到l+1。
            if(F(l,r))ans++;
        }
    }
    cout << ans;
    return 0;
}

蓝桥杯2023年第十四届省赛真题-颜色平衡树

题目描述
给定一棵树,结点由 1 至 n 编号,其中结点 1 是树根。树的每个点有一个颜色 Ci。
如果一棵树中存在的每种颜色的结点个数都相同,则我们称它是一棵颜色平衡树。
求出这棵树中有多少个子树是颜色平衡树。
输入格式
输入的第一行包含一个整数 n ,表示树的结点数。
接下来 n 行,每行包含两个整数 Ci , Fi,用一个空格分隔,表示第 i 个结点的颜色和父亲结点编号。
特别地,输入数据保证 F1 为 0 ,也即 1 号点没有父亲结点。保证输入数据是一棵树。
输出格式
输出一行包含一个整数表示答案。
样例输入
6
2 0
2 1
1 2
3 3
3 4
1 4
样例输出
4
提示
编号为 1, 3, 5, 6 的 4 个结点对应的子树为颜色平衡树。
对于 30% 的评测用例,n ≤ 200,Ci ≤ 200 ;
对于 60% 的评测用例,n ≤ 5000,Ci ≤ 5000 ;
对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ Ci ≤ 200000,0 ≤ Fi < i 。

思路题解

思路:

  • 要判断每个子树是否为平衡树,需要统计子树的每种颜色的节点的数量,并判断所有数量是否相等。

  • 对于一颗树的根节点,若该树的所有子树的统计结果都得到了,就可以直接将子树的统计结果累加,并加上根节点的颜色。因此可以使用dfs对树进行搜索,在后序遍历位置得到子树的统计结果并累加,就可以计算出该树的统计结果,判断所有颜色数量是否相等即可。

注意:

  • 统计结果cnt使用数组时,需要判断整颗树所有颜色的数量,而部分子树的颜色并不包含所有的颜色,每次判断的时间复杂度为O(num_c),num_c为整棵树的颜色种数,这样会超时。因此可以使用map数据结构,这样每次只需判断子树所包含的颜色。
#include<iostream>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
const int N = 2e5+1;
//最终结果
int ans=0;
//将子树的计数结果cnt_nb累加到根节点的结果cnt上
void add(map<int,int>& cnt,map<int,int>& cnt_nb){
    for(auto entry:cnt_nb){
        int c=entry.first,count = entry.second;
        cnt[c] += count;
    }
}
/*
对树进行dfs搜索,树的根节点为i,并返回该子树的各节点颜色计数结果
*/
map<int,int> dfs(vector<int>* g,int* c,int i){
    int sz = g[i].size();
    map<int,int> cnt; //记录子树的每个节点的各颜色节点的数量
    /*如果为叶子节点,直接返回*/
    if(sz==0){ 
        cnt[c[i]] = 1; 
        ans++; 
        return cnt;
    }
    /*如果不是叶子节点*/
    //将根节点的颜色加入cnt
    cnt[c[i]]=1;
    //遍历根节点的所有子树,并将子树的计数结果累加到cnt中
    for(int j=0;j<sz;j++){
        int nb = g[i][j];
        map<int,int> cnt_nb = dfs(g,c,nb);
        add(cnt,cnt_nb);
    } 
    //判断该子树的各种颜色节点的数量是否相等
    int count = cnt[c[i]];
    for(auto entry:cnt){
        //存在一种颜色数量不等,直接返回
        if(entry.second != count) return cnt; 
    }
    //各颜色的数量相等,结果+1
    ans++;
    //返回计数结果
    return cnt;
}
int main()
{
    int n;
    cin>>n;
    vector<int> g[N]; 
    int c[N]; //每个节点的颜色
    for(int i=0;i<n;i++){
        int f;
        cin>>c[i]>>f;
        if(f>=1){
            g[f-1].push_back(i); //记录节点f的子节点i(节点编号从0开始)
        }
    }
    dfs(g,c,0);
    cout<<ans;
    return 0;
}

蓝桥杯2023年第十四届省赛真题-买瓜

题目描述
小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜,每个瓜的重量为 Ai 。
小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。
小蓝希望买到的瓜的重量的和恰好为 m 。
请问小蓝至少要劈多少个瓜才能买到重量恰好为 m 的瓜。如果无论怎样小蓝都无法得到总重恰好为 m 的瓜,请输出 −1 。
输入格式
输入的第一行包含两个整数 n, m,用一个空格分隔,分别表示瓜的个数和小蓝想买到的瓜的总重量。
第二行包含 n 个整数 Ai,相邻整数之间使用一个空格分隔,分别表示每个瓜的重量。
输出格式
输出一行包含一个整数表示答案。
样例输入
3 10
1 3 13
样例输出
2
提示
对于 20% 的评测用例,∑n≤10;
对于 60% 的评测用例,∑n≤20;
对于所有评测用例,1 ≤n≤30,1≤ Ai ≤ 109 ,1 ≤ m ≤ 109

思路题解

对于每一个瓜有三种选择:
1)买整个瓜
2)买半个瓜,需要增加劈瓜次数
3)不买

则可以使用深度优先搜索解决, 对每个瓜的三种选择进行搜索, 解空间树是一颗完全三叉树, 时间复杂度为O(3^n), 肯定会超时, 故需要进行剪枝。

买半个瓜时需要将重量除2,会产生小数,故可以将重量数组都乘2,最大重量也乘2。

搜索时需要记录三个状态,当前层数pos,当前总重量sum,当前劈瓜的次数cnt,以下情况需要剪枝:
1)当前劈瓜次数大于已求得的最小次数,即cnt>ans
2)当前重量之和大于要求的重量,即sum>m

但是这样仍然会超时,还可以将重量数组降序排列,使得更快剪枝。还可以创建一个重量数组的后缀数组suf,这样在搜索时可以利用其剪枝:若当前重量加上剩余的所有瓜重量之和小于要求的重量,剪枝。

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 30; 
int INF = 100;
int n,m;
int v[N]; //重量数组
long suf[N+1]; //重量数组的后缀数组
int ans = INF; //将结果初始化为INF
/*
dfs搜索,参数分别表示当前层数,当前重量之和,切瓜的次数
*/
void dfs(int pos,long sum,int cnt){
    if(sum==m){ //找到了一个结果
        ans = min(ans,cnt);
        return;
    }
    //剪枝
    if(pos>=n || cnt>=ans || sum>m || sum+suf[pos]<m) return;
    //对三种选择进行搜索
    dfs(pos+1,sum+v[pos],cnt); 
    dfs(pos+1,sum+v[pos]/2,cnt+1);
    dfs(pos+1,sum,cnt);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    m*=2; //总重量乘2
    for(int i=0;i<n;i++) cin>>v[i],v[i]*=2;
    sort(v,v+n,greater<int>());
    for(int i=n-1;i>=0;i--) suf[i] = suf[i+1]+v[i];
    dfs(0,0,0);
    if(ans==INF) cout<<-1;
    else cout<<ans;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c/c++ | 静态链接、动态链接

正如标题所见&#xff0c;我们就来讲讲开发时遇到的一些问题&#xff0c;以及解决方案 这里不介绍动态库、静态库的生成与调用&#xff0c; 无论是静态库还是动态库&#xff0c;都是在编译项目的时候链接器会根据编译命令去调用的 如果直接把库&#xff08;动态、静态不论&…

自己本地模拟内存数据库增删改查

目录 学习初衷准备代码实现结果感谢阅读 学习初衷 用于满足自己的测试要求&#xff0c;不连接数据库&#xff0c;也不在意数据丢失 准备 maven依赖 org.springframework.boot spring-boot-starter-test test 代码实现 内存数据库&#xff08;InMemoryDatabase&#xff0…

玩转SpringBoot:动态排除Starter配置,轻松部署

引言 在软件开发中&#xff0c;进行本地单元测试是一项常规且必要的任务。然而&#xff0c;在进行单元测试时&#xff0c;有时需要启动一些中间件服务&#xff0c;如Kafka、Elasticjob等。举例来说&#xff0c;我曾经遇到过一个问题&#xff1a;项目中使用了Redisson锁&#x…

试手一下CameraX(APP)

书接上回。 首先还是看谷歌的官方文档&#xff1a; https://developer.android.com/media/camera/camerax?hlzh-cn https://developer.android.com/codelabs/camerax-getting-started?hlzh-cn#1 注&#xff1a;这里大部分内容也来自谷歌文档。 官方文档用的是Kotlin&…

JavaWeb之 创建 Web项目,使用Tomcat 部署项目,使用 Maven 构建Web项目(一万八千字详解)

目录 前言3.1 Tomcat 简介3.1.1 什么是 Web服务器3.1.2 Tomcat 是什么3.1.3 小结 3.2 Tomcat 的基本使用3.2.1 下载 Tomcat3.2.2 安装 Tomcat3.2.3 卸载 Tomcat3.2.4 启动 Tomcat3.2.5 关闭 Tomcat3.2.6 配置 Tomcat3.2.7 在 Tomcat 中部署 Web项目 3.3 在 IDEA 中创建 Web 项目…

探索前景:机器学习中常见优化算法的比较分析

目录 一、介绍 二、技术背景 三、相关代码 四、结论 一、介绍 优化算法在机器学习和深度学习中至关重要&#xff0c;可以最小化损失函数&#xff0c;从而改善模型的预测。每个优化器都有其独特的方法来导航损失函数的复杂环境以找到最小值。本文探讨了一些最常见的优化算法&…

Python爬虫——解析常用三大方式之JsonPath

目录 JsonPath 安装 使用 我们的json数据 基本使用 案例 总结 JsonPath 主要适用于解析一些json的数据 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jsonpath 使用 obj json.load(open( json文件 , r , encoding utf-8 ) )ret jsonpath.…

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

EdgeX Foundry 安全模式安装部署

文章目录 一、安装准备1.官方文档2. 克隆服务器3.安装 Docker4.安装 docker-compose 二、安装部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs…

机器学习|KNN和Kmeans

KNN和Kmeans KNN KNN-K个最近的邻居&#xff0c;而K是可人先预设出来的。 所谓近朱者赤&#xff0c;近墨者黑。 可以选取离当前最近的K个样本来作为辅助判断&#xff0c;因为本样本和最近的K个样本应该是处于一种相似的状态。 以下是一个苹果和梨的识别任务。 图上会出现一个未…

立式学习灯值得买吗?五款立式学习灯真实测评

现在人们注重健康生活&#xff0c;特别是在面对目前青少年严峻的近视情况&#xff0c;大路灯作为补充光线的照明电器&#xff0c;在市场热度持续高涨&#xff0c;但其负面评价也屡见不鲜。有人反映使用后眼睛更容易疲劳、酸疼等不适症状。作为一名专业测评师&#xff0c;我提醒…

pdf编辑软件哪个好用?5款PDF编辑器分享

pdf编辑软件哪个好用&#xff1f;PDF编辑软件在现代办公和学术研究中发挥着举足轻重的作用&#xff0c;它们不仅具备基础的编辑和修改功能&#xff0c;还能够支持多种注释工具&#xff0c;帮助我们高效地管理和整理PDF文件。无论是需要调整文档布局、添加文本或图像&#xff0c…

Linux系统——LNMP架构

目录 一、LNMP架构定义 1.LNMP定义 1.1LNMP工作原理 2.FASTCGI 2.1CGI的由来 2.2为什么会有FastCGI 3.PHP 3.1什么是PHP-FPM 3.2PHP配置 3.1.1对配置文件的修改生效方法 3.1.2/etc/php.ini配置文件格式 3.1.3注释符&#xff1a; 3.1.4php.ini配置参考文档 3.1.5…

【Linux取经路】文件系统——inode与软硬链接

文章目录 一、前言二、认识硬件——磁盘2.1 磁盘的存储构成2.2 磁盘的逻辑抽象 三、操作系统对磁盘的使用3.1 再来理解创建文件3.2 再来理解删除文件3.3 再来理解目录 四、硬链接五、软链接六、结语 一、前言 在之前的【Linux取经路】文件系统之被打开的文件——文件描述符的引…

自动驾驶加速落地,激光雷达放量可期(上)

1 激光雷达应用广泛&#xff0c;汽车有望成最大催化 激光雷达&#xff08;LiDAR&#xff09;是一种主动遥感技术&#xff0c;通过测定传感器发出的激光在传感器与目标物体之间的传播距离&#xff0c;来分析目标地物表面的反射能量大小、反射波谱的幅度、频率和相位等信息&#…

python基础使用之记录日志模块

我们在编写Python 程序时&#xff0c;记录日志信息是一种非常重要的需求&#xff0c;日志可以帮助调试和跟踪程序的执行过程。那么Python中提供了内置的logging模块&#xff0c;用于记录各种级别的日志信息。本文主要介绍Python日志信息输出的实现过程。 1. 导入 logging 模块…

C++入门全集(4):类与对象【下】

一、再谈构造函数 1.1 构造函数体内赋值 我们知道&#xff0c;在创建对象时&#xff0c;编译器会自动调用构造函数给对象中的各个成员变量一个合适的初始值 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _yea…

开源项目:智能化图像分类技术在新能源发电监控中的应用与实践

一、引言 在当今世界&#xff0c;能源的转型和升级是推动社会可持续发展的关键因素。随着技术的进步&#xff0c;新能源发电逐渐成为能源结构调整的重要力量。在众多发电方式中&#xff0c;新能源发电技术如风力、太阳能等因其清洁、可再生的特性而备受青睐。然而&#xff0c;…

百度文库旋转验证码识别

最近研究了一下图像识别&#xff0c;一直找到很好的应用场景&#xff0c;今天我就发现可以用百度的旋转验证码来做一个实验。没想到效果还挺好&#xff0c;下面就是实际的识别效果。 1、效果演示 2、如何识别 2.1准备数据集 首先需要使用爬虫&#xff0c;对验证码图片进行采…

MATLAB中sigmoid函数用法

目录 语法 说明 示例 应用 sigmoid 激活 sigmoid函数的功能是应用sigmoid激活 语法 Y sigmoid(X) 说明 sigmoid 激活运算将 sigmoid 函数应用于输入数据。此运算等效于&#xff1a; 注意 此函数将 sigmoid 运算应用于 dlarray 数据。如果要在 layerGraph 对象或 Layer …