2024第十五届蓝桥杯省赛C++A组程序设计题解

 

 

ps:没有答案,考场上的代码,不一定对,大佬们轻喷,可以提供点更好的思路~

试题C:训练士兵

9ea249fe760341b7986d75dc43a90f1a.png

2c45d7cf7aac4bcf9fdb18cb4f282fca.png

解题思路

对于每次训练,需要考虑采用士兵单独训练还是组团训练的方式,故每次训练将所需训练次数大于0的士兵花费进行求和,与组团训练进行比较,以此判断是否要采用组团训练的方式

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
using namespace std;
int N, S;
int main() {
	cin >> N >> S;
	int n = N;
	vector<int> p;		//成本
	vector<int> c;		//次数
	while (n--) {
		int pi, ci;
		cin >> pi >> ci;
		p.push_back(pi);
		c.push_back(ci);
	}
	int sum = 0;
	while (1) {
		int flag = 1;
		int consume = 0;
		for (int i = 0; i < c.size(); i++) {
			if (c[i] > 0)
			{
				consume += p[i];
				c[i]--;
				flag = 0;
			}
		}
		sum += min(consume, S);
		if (flag) break;
	}
	cout << sum;
	return 0;
}

试题D:团建

c00ca8135f57425091426e5fd5895438.png 9c8dc68914f44edd99da188cf1a9b981.png

解题思路

对于该题,考虑层序遍历,先将树的孩子用vector容器进行存储,因题目说明每棵树不会有节点的值重复,故进行层序遍历,判断树的每层是否有相同结点值,以此判断最长公共前缀

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
using namespace std;
const int T = 200000;
vector<vector<int>> tree1(T);
vector<vector<int>> tree2(T);
vector<int> nums1(T);
vector<int> nums2(T);
int N, M;
int get() {
	int sum = 0;	
	int t1 = 1, t2 = 1;
	if (nums1[1] == nums2[1]) sum++;
	else return 0;
	while (1) {
		int i, j;
		int flag = 1;
		if (tree1[t1].size() == 0 || tree2[t2].size() == 0) break;
		for (i = 0; i < tree1[t1].size(); i++) {
			for (j = 0; j < tree2[t2].size(); j++) {
				if (nums1[tree1[t1][i]] == nums2[tree2[t2][j]])   //寻找公共前缀
				{
					flag = 0;
					t1 = tree1[t1][i];
					t2 = tree2[t2][j];                            //选取下一层的父节点
					sum++;
					break;
				}
			}
		}
		if (flag) break;
	}
	return sum;
}
int main() {
	cin >> N >> M;
	int n = N, m = M;
	int temp;
	while (n--) {
		cin >> temp;
		nums1[N - n] = temp;
	}
	while (m--) {
		cin >> temp;
		nums2[M - m] = temp;
	}
	n = N - 1; m = M - 1;
	int t1, t2;
	while (n--) {
		cin >> t1 >> t2;
		tree1[min(t1, t2)].push_back(max(t1, t2));
	}
	while (m--) {
		cin >> t1 >> t2;
		tree2[min(t1, t2)].push_back(max(t1, t2));       //存储每个节点的孩子
	}
	cout << get();
	return 0;
}

 试题E:   成绩统计

284b961ff41046bc9a955037c1f4d0e1.png

解题思路

对于该题,考虑动态规划解法,先取前k个人的成绩计算其方差,并将成绩记录在数组中,记录当前均值,设小蓝已检查前i-1个人的成绩,若方差依然大于T,找出离均值最远的一个成绩,若第i个人的成绩距离当前均值更近,则剔除离均值较远的成绩,使得方差变小,若遍历完整个数组均找不到更小的方差,返回-1

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
using namespace std;
vector<double> t;
vector<double> nums;
int N, k, T;
bool calculate0() {            //判断方差是否小于指定值
	double e;
	double sum = 0;
	for (auto num : t) {
		sum += num;
	}
	e = sum / k;
	double val = 0;
	for (auto num : t) {
		val += (num - e) * (num - e);
	}
	val /= k;
	if (val < T) return true;
	else return false;
}
int main() {
	cin >> N >> k >> T;
	int n = N;
	while (n--) {
		double temp;
		cin >> temp;
		nums.push_back(temp);
	}
	if (N < k) { cout << -1; return 0; }
	double mean = 0;
	for (int i = 0; i < k; i++) {
		t.push_back(nums[i]);
		mean += nums[i];
	}
	mean /= k;
	if (calculate0()) { cout << k; return 0; }
	for (int length = k; length < nums.size(); length++) {
		double sub = 0;
		int x = -1;
		for (int i = 0; i < t.size(); i++) {
			if (abs(t[i] - mean) > sub) {
				sub = abs(t[i] - mean);
				x = i;
			}
		}
		if (x != -1 && sub > abs(nums[length] - mean))            //判断是否更接近均值
			t[x] = nums[length];
		if (calculate0()) { cout << length + 1; return 0; }
	}
	cout << -1;
	return 0;
}

试题F:因数计数

24b2e93b5c6f4aad839b7b6e50448e93.png

解题思路

循环遍历数组,判断因数找出所有的有序二元组对,并用集合进行存储,遍历集合,以i,j,k,l互不相等为条件,生成有序四元组,计算四元组个数

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
using namespace std;
set<pair<int, int>> s;
int main() {
	int N;
	cin >> N;
	vector<int> nums;
	while (N--) {
		int temp;
		cin >> temp;
		nums.push_back(temp);
	}
	for (int i = 0; i < nums.size(); i++) {
		for (int j = i + 1; j < nums.size(); j++) {
			if (nums[i] % nums[j] == 0)
				s.insert({ j + 1,i + 1 });
			if(nums[j] % nums[i] == 0)
				s.insert({ i + 1,j + 1 });			//判断ai和aj是否为对方的因数
		}
	}
	int sum = 0;
	for (auto t1 : s) {
		for (auto t2 : s) {
			if (t1.first != t2.first && t1.first != t2.second && t1.second != t2.first && t1.second != t2.second)
				sum++;
		}
	}
	cout << sum;
	return 0;
}

试题G:零食采购

56f0c99b98044f7f90a9d01aadb5bee8.png 

99c1cd5c9a0b42c9aa203f0778d00399.png

解题思路

该题是一道图论问题,目的是寻找最短路径下能采购到的零食总数,故先利用矩阵生成无向连通图,再采用深度优先遍历,存储两点之间的所有路径,再判断哪条最短路径,在最短路径下模拟零食采购,用集合存储零食种类,集合大小即为所求零食种类数

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
using namespace std;
int N, q;
vector<int> type;
vector<int> temp;
void dfs(int b, int e,vector<vector<int>>& line,vector<vector<int>> matrix,int length) {
	if (b == e) { line.push_back(temp); return; }
	if (length > N) return;
	for (int i = 0; i < matrix[b].size();i++) {
		if (matrix[b][i] == 1) {
			temp.push_back(i);						//将当前节点加入路径中
			dfs(i, e, line, matrix,length+1);		
			temp.pop_back();
		}
	}
	return;
}
int main() {
	cin >> N >> q;
	vector<int> t(N, 0);
	vector<vector<int>> matrix(N, t);
	int n = N;
	while (n--) {
		int temp;
		cin >> temp;
		type.push_back(temp);
	}
	n = N - 1;
	while (n--) {
		int i, j;
		cin >> i >> j;
		matrix[i - 1][j - 1] = 1;
		matrix[j - 1][i - 1] = 1;				//生成无向连通图
	}
	while (q--) {
		int begin0, end0;
		cin >> begin0 >> end0;
		vector<vector<int>> line;
		dfs(begin0 - 1, end0 - 1, line,matrix,0);
		int minlength = line[0].size();
		int f = 0;
		for (int i = 0; i < line.size(); i++)
		{
			if (line[i].size() < minlength) {
				f = i;
				minlength = line[i].size();			//寻找最短路径
			}
		}
		set<int> s;
		s.insert(type[begin0 - 1]);
		for (auto x : line[f]) {
			s.insert(type[x]);                     //模拟零食采购
		}
		cout << s.size();
	}
	return 0;
}

 

 

 

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

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

相关文章

【网站项目】“最多跑一次”小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

面试(06)————MySQL篇

目录 问题一&#xff1a;在MySQL中&#xff0c;如何定位慢查询&#xff1f; 方案一&#xff1a;开源工具 方案二&#xff1a;MySQL自带慢日志 模拟面试 问题二&#xff1a;这个SQL语句执行很慢&#xff0c;如何分析的呐&#xff1f; 模拟面试 问题三&#xff1a;了解过索引…

2024 IDM最新破解版及软件介绍

*IDM&#xff1a;信息时代的高效管理工具** 在快节奏的现代社会中&#xff0c;随着信息的爆炸式增长&#xff0c;如何高效、有序地管理信息成为每个人都需要面对的挑战。IDM&#xff0c;作为一种信息管理工具&#xff0c;正在逐渐受到人们的青睐。 IDM&#xff0c;全称Inform…

Android 出现4G模块无法上网问题

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

【prometheus】k8s集群部署AlertManager实现邮件和钉钉告警

目录 一、AlertManager概述 1.1 alertmanager简介 1.2 AlertManager核心概念 1.2.1 分组 1.2.2 抑制 1.2.3 静默 1.2.4 客户的行为 1.2.5 高可用性 二、Alertmanager部署邮箱告警 2.1 邮箱配置 2.2 Alertmanager global和route路由配置 2.3 部署prometheus和alertM…

如何在PostgreSQL中创建一个新的数据库,并指定所有者?

文章目录 解决方案示例代码 PostgreSQL是一个强大的开源关系型数据库管理系统&#xff0c;它允许用户创建和管理多个数据库。在PostgreSQL中创建一个新的数据库并指定所有者是一个常见的操作。下面&#xff0c;我们将详细解释如何执行这一操作&#xff0c;并提供示例代码。 解…

Redis入门到通关之数据结构解析-SkipList

文章目录 ☃️概述☃️总结 ☃️概述 SkipList&#xff08;跳表&#xff09;是一种数据结构&#xff0c;用于实现有序元素的动态集合&#xff0c;它的设计目的是在有序链表的基础上通过增加多级索引来提高查找效率。 跳表的核心思想是在原始链表的基础上建立多层索引&#xf…

如何使用 Node.js 发送电子邮件全解和相关工具推荐

大多数Web应用程序都需要发送电子邮件。它可能用于注册、密码重置、状态报告&#xff0c;甚至是完整的市场营销活动&#xff0c;如新闻和促销。本教程解释了如何在Node.js中发送电子邮件&#xff0c;但其概念和挑战适用于您正在使用的任何系统。 你会在 npm 上找到大量与电子邮…

贪吃蛇的实现(一)

一、前言 学完C语言和数据结构的链表部分后&#xff0c;贪吃蛇的游戏也终于可以着手的实现了。对于贪吃蛇这个经典游戏&#xff0c;相信小伙伴们都不会太陌生&#xff0c;接下来我们 一起去剖析关于贪吃蛇游戏内部的一些逻辑结构和整体思维。 二、Win32 API 本章实现贪吃蛇会用…

读天才与算法:人脑与AI的数学思维笔记06_算法的进化

1. 现代算法 1.1. 知识不仅建立在真理之上&#xff0c;也建立在错误之上。 1.1.1. 卡尔荣格&#xff08;Carl Jung&#xff09; 1.2. 现代算法是可以自学的&#xff0c;尤其是推荐系统算法&#xff0c;它可以根据每个人的喜好推荐有趣的东西给我们 1.2.1. 算法通过与用户之…

PTA L2-052 吉利矩阵

题目 解析 这题考的是搜索剪枝 可行性剪枝&#xff1a; 即判断当前行&#xff08;列&#xff09;是否已经超过L和剩下的格子都填最大值是否小于L&#xff0c;若是则剪枝。 当前行数大于1时&#xff0c;判断上一个填完的行是否等于L&#xff0c;若否&#xff0c;则剪枝。 当前行…

一个简单的记工tkinter窗口

代码分享: 导入datetime模块&#xff0c;用于获取当前日期 import datetime as da 导入csv模块&#xff0c;用于读写csv文件 import csv 导入tkinter模块&#xff0c;用于创建窗口和按钮 from tkinter import * 创建主窗口 appTk() 设置窗口大小为1048x2048&#xff0…

【网络协议】 TCP与UDP协议区别及应用场景深度分析

1. TCP与UDP简介 1.1 TCP 1.1 定义 TCP&#xff08;TransmissionControl Protocol&#xff09;传输控制协议。 是一种可靠的、面向连接的协议&#xff08;eg:打电话&#xff09;、传输效率低全双工通信&#xff08;发送缓存&接收缓存&#xff09;、面向字节流。使用TCP的应…

ROS1快速入门学习笔记 - 01Linux基础

目录 一、Linux极简基础 二、C与Python极简基础 1. for循环 2. while循环 3. 面向对象 一、Linux极简基础 终端快捷键&#xff1a;ctrlaltt 命令行的操作方式 查看当前终端所在路径&#xff1a;pwd切换路径cd&#xff1b;例如cd /home/ 进入home文件夹&#xff1b;cd …

【精】Devops实战学习CI/CD落地方案#CI篇#

目录 先有个大概了解 基本概念 CI/CD Devops 阿里云效 devops产品 K8s jenkins docker git maven 知行合一&#xff0c;上手操作 实操记录 安装VMware 安装并配置虚拟机 安装并配置docker docker安装 修改镜像源&#xff08;关键且易出错&#xff09; CentOS…

【数据结构-树和二叉树-森林-哈夫曼树】

目录 1 树1.1 树的描述&#xff08;基本术语&#xff09; 2 二叉树&#xff08;树的度最大为2&#xff09;2.1 注意事项-五种基本形态2.2 二叉树的抽象数据类型定义 3 二叉树的性质3.1 两种特殊形式的二叉树-重点会计算3.2 题目练习&#xff1a; 4 二叉树的存储结构4.1 顺序存储…

竞逐智能家居大模型:美的“蓄力”,海尔“疾行”

配图来自Canva可画 随着ChatGPT火热出圈&#xff0c;AI大模型便成为了各行各业必争的高地。“BAT”等互联网大厂、华为、小米等通讯巨头&#xff0c;以及一些垂直AI公司&#xff0c;都开始在大模型市场积极布局。众所周知&#xff0c;发展大模型的关键在于应用场景的落地&…

超星图书转成PDF格式

转为pdf 为避免浪费您的时间&#xff0c;本篇转载文章不值得花费您的宝贵时间阅读 方法一 感谢医学插画动画杜鹏 Roison An两位提供的方法&#xff0c;经试验后简化了一下&#xff0c;得出以下方法:1、使用超星打开你想要转换的图书2、依次打开本书的所有页面&#xff0c;不要…

Linux基础和常见命令速览

来源&#xff1a;Linux 基础知识总结 | JavaGuide 一、Linux文件系统 1. 文件系统 Linux 系统中的一个重要的概念&#xff1a;一切都是文件。 在 Linux 操作系统中&#xff0c;一切被操作系统管理的资源&#xff0c;如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件…