第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结

news2024/12/28 19:34:31

目录

个人总结

C/C++ 组真题

握手问题

小球反弹

好数

R 格式

宝石组合

数字接龙

爬山

拔河

​编辑

再总结及后续规划


个人总结

第一次参加蓝桥杯,大二,以前都在在学技术,没有系统的学过算法。所以,还是花了挺多时间去备战的,因为暑假想找实习,就想拿个奖写简历上。备战了大概一个多月,学了一些基础的算法(dfs bfs 动态规划为主),刷了快200道题吧,但还是因为缺少经验,比赛时有点茫然了,然后大概率是寄了。

C/C++ 组真题

握手问题

这道第一题相对于去年还算是比较简单,排列 + 特殊情况处理即可

(50 * 49) / 2 - (6*7) / 2 = 1204,答案应该是正确的

小球反弹

这个应该是错了哈哈,答案是 1100325199.77,但和这个值挺像的,可惜只看答案。

前两道题都是数学问题,唉,后悔没有静下心来看第二题了。

好数

这道题直接暴力模拟即可,数据量没有很大。

#include <iostream>
using namespace std;
int N;
int main()
{
	cin >> N;
	int Count = 0; // 记录总个数
	for (int i = 1; i <= N; i++)
	{
		// 判断某一个数是否是 好数
		int n = i; // 用 n 记录 i
		int flag = 1; // 1 此时计算的是 i 的奇数位, 0 表示此时计算的是 i 的偶数位
		int ret = 1; // 记录当前数否为 好数
		while (n > 0)
		{
			int end = n % 10;
			if (flag == 1)
			{
				if (end % 2 == 0)
				{
					ret = 0;
					break;
				}
				flag = 0;
			}
			else //  flag = 0
			{
				if (end % 2 != 0)
				{
					ret = 0;
					break;
				}
				flag = 1;
			}
			n /= 10;
		}
		if (ret == 1) Count++;
	}
	cout << Count << endl;
	return 0;
}

R 格式

 

这道题看起来挺简单的,但如果要拿满分的话,需要使用字符串模拟,我直接使用 long long 了,应该能拿 50% 的分。

long long  50%代码

#include <iostream>
using namespace std;
double d;
int n;
long long func(int n)
{
	long long ret = 1;
	while (n--)
	{
		ret *= 2;
	}
	return ret;
}
int main()
{
	cin >> n >> d;
	cout << (long long)(func(n) * d + 0.5) << endl;
	return 0;
}

宝石组合

 这道题没有学过网上的那些公式算法,第一个想到的是暴击解法,时间复杂度O(N^3),但思考了一会,发现是可以用哈希表来优化的,时间复杂度可以降到 O(N^2)。不过貌似依然过不了很多数据,第二个比较麻烦的点就是如果 S 相同的情况下要按字典序排顺序。

#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
long long N;
long long nums[100010];
long long func(long long a, long long b, long long c = 1)
{
	long long Max = max(a, max(b, c));
	long long i = 0;
	for (i = Max; i >= 0; i += Max)
	{
		if (i % a == 0 && i % b == 0 && i % c == 0) break;
	}
	return i;
}
long long get_S(long long a, long long b, long long c)
{
	long long tmp = a * b * c * func(a, b ,c);
	long long ret = tmp / (func(a, b) * func(a, c) * func(b, c));
	return ret;
}
int main()
{
	
	cin >> N;
	for (long long i = 1; i <= N; i++) cin >> nums[i];
	unordered_map<long long, pair<long long, long long>> hash;
	for (long long i = 2; i <= N; i++)
	{
		for (long long j = i - 1; j >= 1; j--)
			hash[nums[i] * nums[j]] = { j, i };
	}
	long long ret[3] = {100010, 100010, 100010};
	long long S = 0;
	for (long long i = 1; i <= N; i++)
	{
		for (auto& e : hash)
		{
			if (e.second.first != i && e.second.second != i)
			{
				long long tmp = get_S(nums[i], nums[e.second.first], nums[e.second.second]);
				if (tmp > S)
				{
					S = tmp;
					ret[0] = nums[i];
					ret[1] = nums[e.second.first];
					ret[2] = nums[e.second.second];
				}
				else if (tmp == S)
				{
					if (ret[0] > nums[i])
					{
						ret[0] = nums[i];
						ret[1] = nums[e.second.first];
						ret[2] = nums[e.second.second];
					}
					else if (nums[i] == ret[0] && ret[1] > nums[e.second.first])
					{
						ret[0] = nums[i];
						ret[1] = nums[e.second.first];
						ret[2] = nums[e.second.second];
					}
					else if (nums[i] == ret[0] && ret[1] == nums[e.second.first] && ret[2] > nums[e.second.second])
					{
						ret[0] = nums[i];
						ret[1] = nums[e.second.first];
						ret[2] = nums[e.second.second];
					}
				}
			}
		}
	}
	cout << ret[0] << " " << ret[1] << " " << ret[2] << endl;
	return 0;
}

数字接龙

这道题,打眼一看是 dfs ,觉得自己会,就开始做,没想到做到最后,不会判断路径是否交叉,有点懵逼了,就直接将得到的所有可以走完的路径按字典序排序后取了第一个,最后估计还没有直接输出 - 1的人得的分多。还是比赛经验不够,应该先好好看完题再开始写代码的。

这里就不放我的错代码了,唉,看到正确答案就在自己负责调试的 vector 里,却没有办法去除错错误的答案...

知乎正确答案:

#include <iostream>
#include <vector>
using namespace std;
const int N = 11;
int a[N][N];
int dt[8][2] = { {-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1} };
int n, k;
vector<int> path;
vector<int> res;
bool ban[N][N][N][N];
bool vis[N][N];
void dfs(int sx, int sy)
{
	if (!res.empty()) return;
	if (sx == n - 1 && sy == n - 1)
	{
		if (path.size() == n * n - 1) res = path;
		return;
	}
	if (path.size() == n * n - 1) return;
	for (int i = 0; i < 8; i++)
	{
		if (!res.empty()) return;
		int dx = dt[i][0], dy = dt[i][1];
		int x = sx + dx, y = sy + dy;

		if (x >= 0 && x < n && y >= 0 && y < n && !vis[x][y] && a[x][y] == (a[sx][sy] + 1) % k)
		{
			if (dx != 0 && dy != 0 && ban[sx + dx][sy][sx][sy + dy]) continue;

			ban[sx][sy][x][y] = ban[x][y][sx][sy] = true;
			vis[x][y] = true;
			path.push_back(i);
			dfs(x, y);
			path.pop_back();
			vis[x][y] = false;
			ban[sx][sy][x][y] = ban[x][y][sx][sy] = false;
		}
	}
}
int main()
{
	scanf("%d%d", &n, &k);
	for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) scanf("%d", &a[i][j]);
	vis[0][0] = true;
	dfs(0, 0);
	if (!res.empty())
	{
		for (auto x : res) printf("%d", x);
	}
	else
	{
		puts("-1");
	}
	return 0;
}

爬山

 由于上一题浪费了太多时间,这道题也没有认真看,想了一下动态规划,感觉有点复杂,凭感觉写了一下...出来后看了答案才发现是 优先级队列 + 贪心

这是知乎上的贪心答案,但这个做法对于有的测试用例也是过不了的,我感觉还是应该用动态规划哈哈。

int main()
{
	priority_queue<int> heap;
	scanf("%d%d%d",&n,&P,&Q);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),heap.push(a[i]);

	while(P||Q)
	{
		auto x=heap.top();
		heap.pop();

		if(P&&Q)
		{
			int yl=_sqrt(x);
			int y2=x/2;
			if(y2<=yl)
			{
				Q--;
				heap.push(y2);
			}
			else
			{
				P--;
				heap.push(yl);
			}
		}
		else if(P)
		{
			int yl=_sqrt(x);
			P--;
			heap.push(yl);
		}
		else
		{
			int y2=x/2;
			Q--;
			heap.push(y2);
		}
	}

	ll res=0;
	while(!heap.empty())
	{
		int x=heap.top();
		heap.pop();
		res+=x;
	}
	printf("%lld\n",res);
	return 0;
}

拔河

这道题看都没看,唉,应该先看一下的......,起码得个暴力分

标准答案:指针 + 二分

#include <iostream>
#include <vector>
#include <set>
using namespace std;
typedef long long ll;
const int N = 1003;
int a[N];
int n;
ll s[N];
int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]), s[i] = s[i - 1] + a[i];

	multiset<ll> S;
	for (int l = 1; l <= n; l++)
	{
		for (int r = l + 1; r <= n; r++)
		{
			S.insert(s[r] - s[l]);
		}
	}
	ll res = 0x3f3f3f3f;
	for (int r = 1; r < n; r++)
	{
		for (int l = 0; l < r; l++)
		{
			ll val = s[r] - s[l];

			auto it = S.lower_bound(val);
			if (it != S.end())
			{
				ll ans = abs(*it - val);
				res = min(res, ans);
			}
			if (it != S.begin())
			{
				it--;
				ll ans = abs(*it - val);
				res = min(res, ans);
			}
		}

		for (int r2 = r + 1; r2 <= n; r2++)
		{
			S.erase(S.find(s[r2] - s[r]));
		}
	}
	printf("%lld\n", res);
	return 0;
}

再总结及后续规划

总结:自己算法还是太菜了(毕竟练习时长只有一个月),本次大概率可能是省二 ~ 省三了,省一的概率不大,不知道大三还有没有机会再打蓝桥杯,那时候应该要实习 / 考研吧。

接下来的安排,下周六还有一场天梯赛,打完后就要继续学技术了,冲一下暑假的日常实习,到时候就开始佛系做力扣每日一题了,不再花时间集中学算法了,算法竞赛的帮助,对于找开发的工作,有帮助,但最重要的还是技术得学到手,做项目。

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

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

相关文章

政安晨:【深度学习神经网络基础】(七)—— 神经网络评估分类

目录 简述 评估分类概述 二值分类 多类分类 对数损失 多类对数损失 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指…

深入了解数据结构第四弹——排序(1)——插入排序和希尔排序

前言&#xff1a; 从本篇开始&#xff0c;我们就开始进入排序的学习&#xff0c;在结束完二叉树的学习之后&#xff0c;相信我们对数据在内存中的存储结构有了新的认识&#xff0c;今天开始&#xff0c;我们将进入排序的学习&#xff0c;今天来学习第一篇——插入排序 目录 什…

Python | Leetcode Python题解之第30题串联所有单词的子串

题目&#xff1a; 题解&#xff1a; class Solution:def findSubstring(self, s: str, words: List[str]) -> List[int]:res []m, n, ls len(words), len(words[0]), len(s)for i in range(n):if i m * n > ls:breakdiffer Counter()for j in range(m):word s[i j…

Oracle-实例重启导致其他实例不可访问!

问题背景&#xff1a; 用户报障生产一套11G的RAC集群&#xff0c;每个节点有5个数据库实例&#xff0c;其中一个实例由于ORA-00600错误引发实例异常重启&#xff0c;在该实例重启之后&#xff0c;同服务器上的其他4个实例均出现无法访问的情况&#xff0c;应用反馈出现ORA-1253…

C++初识

这里会对一些内容进行简单的提起&#xff0c;后面会详细讲解 一、注释 作用&#xff1a;在代码中加入一些说明和解释&#xff0c;方便自己或其他人阅读代码 两种格式&#xff1a; 1、单行注释&#xff1a; // 描述信息 通常放在一行代码的上方&#xff0c;或者一条语句的末…

Java代码基础算法练习-删除空格-2024.04.15

任务描述&#xff1a; 请从键盘获取一串字符&#xff0c;然后实现删除字符串空格的操作。 任务要求&#xff1a; 代码示例&#xff1a; 这里提供两种方法 1.使用正则表达式&#xff08;推荐&#xff09; // 用正则表达式的方法 System.out.println("删除空格后的的字符…

嵌入式MCU BootLoader开发配置详细笔记教程

目录 一、BootLoader基础 二、BootLoader原理及配置 三、BootLoader程序 bootloader.h bootloader.c 四、Application1 用户程序 application1.h application1.c 五、Application2 用户程序 application2.h 六、程序运行效果 七、工程文件Demo 一、BootLoader基础 …

FRR-NET:用于弱光图像增强的快速重参数残差网络

很久之前写的文章&#xff0c;前两天才见刊。项目的具体代码因项目原因无法公布&#xff0c;我自己重新训练了一个版本&#xff08;包含两类预训练模型&#xff09;&#xff0c;供初学者参考。本文主要为AB式创新。 文章链接&#xff1a;paper 代码链接&#xff1a;GitHub || …

使用脚本部署openstack平台

两台虚拟机&#xff0c;compute和controller 建议两台虚拟机都配置&#xff0c;内存4G&#xff0c;硬盘60G&#xff0c;网络要在虚拟机设置这里添加一个网络适配器&#xff0c;第一个是主机模式192.168.10.0&#xff0c;第二个是NAT模192.168.20.0&#xff0c; 可以在此处了解一…

vue源码解析——diff算法/双端比对/patchFlag/最长递增子序列

虚拟dom——virtual dom&#xff0c;提供一种简单js对象去代替复杂的 dom 对象&#xff0c;从而优化 dom 操作。virtual dom 是“解决过多的操作 dom 影响性能”的一种解决方案。virtual dom 很多时候都不是最优的操作&#xff0c;但它具有普适性&#xff0c;在效率、可维护性之…

C++ 之 【类与对象】从入门到精通一条龙服务 最终篇(static成员、友元、匿名对象。。。)

&#x1f4b4;到用时方恨早&#xff0c;白首方悔挣的少 车到山前没有路&#xff0c;悬崖勒马勒不住 一、再谈构造函数 1.构造函数体赋值 2.初始化列表 3.explicit关键字 二、Static成员 1.概念 2.特性 三、友元 1.友元函数 2.友元类 四、内部类 五、匿名对象 六、…

【uniapp】vscode安装插件、ts校验、允许json文件注释

1、vscode安装的插件&#xff1a; uni-create-viewuni-hlperuniapp小程序扩展 2、ts校验 安装插件&#xff1a; pnpm i -D types/wechat-miniprogram uni-helper/uni-app-types配置tsconfig.json {"extends": "vue/tsconfig/tsconfig.json","compi…

向量 | vector;标量 | scalar;矩阵;张量

目录 什么是标量 什么是向量? 向量的3种表达方式 向量的矩阵表示 什么是矩阵 什么是张量 什么是标量 标量只有大小概念,没有方向的概念。通过一个具体的数值就能表达完整。 比如:重量、温度、长度、提及、时间、热量等都数据标量。

gzip,bzip2,xz,tar-读书笔记(九)

gzip 将文件进行压缩 在Linux系统中&#xff0c;gzip 是一个压缩和解压文件的命令工具。它使用LZ77压缩算法及霍夫曼编码&#xff08;Huffman Coding&#xff09;来压缩文件&#xff0c;通常用来减少文件的大小&#xff0c;以节约磁盘空间或减少网络传输的时间。 gzip 命令的…

SpringBoot集成JWT快速入门Demo

目录 1. 概述 2. JWT的请求流程 3. Session认证与JWT认证的区别 4 JWT优缺点 4.1 优点 4.2 缺点 5. 快速入门 5.1 创建工程 5.2 导入依赖 5.3 添加配置文件 5.4 添加Swagger2配置类 5.5 添加JWT工具类 5.6 添加entity、service、controller类 5.7 添加拦截器类 …

【Linux】CentOS 7安装后没有图形界面

专栏文章索引&#xff1a;Linux 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、项目场景 二、问题描述 三、原因分析 四、解决方案 1.当前处于命令行界面&#xff0c;可以切换为图形界面 2.安装时没有安装图形界面&#xff0c;选择了Minimal Install 3.下…

【Linux】磁盘分区扩容到原有目录(LVM)

一、LVM基本组成 LVM(Logical Volume Manager&#xff0c;逻辑卷管理)逻辑卷管理器是负责管理物理卷、卷组和逻辑卷的软件层。它提供了创建、调整和管理这些组件的命令和工具&#xff0c;使得用户能够灵活地调整和管理磁盘空间。 1.物理卷&#xff08;PV&#xff0c;Physical…

基于Springcloud可视化项目:智慧工地可视化大数据云平台源码

目录 技术架构 智慧工地系统在实际推行过程中遇到的问题 智慧工地接纳程度较低 基础设施条件有待完善 智慧工地整体生态尚未完善 智慧工地平台各功能模块 施工过程工信程息信管息理管模理块 人员管理模块 生产管理模块 技术管理模块 质量管理模块 安全管理模块 绿…

免费的 ChatGPT 网站(六个)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、insCode二、讯飞星火三、豆包四、文心一言五、通义千问六、360智脑 现在智能…

关于GDAL计算图像坐标的几个问题

关于GDAL计算图像坐标的几个问题_gdal读取菱形四角点坐标-CSDN博客 这篇文章写的很好&#xff0c;讲清楚了图像行列号与图像点坐标&#xff08;x,y&#xff09;对应关系&#xff0c;以及图像行列号如何转为地理坐标的&#xff0c;转载一下做个备份。 1.关于GDAL计算图像坐标的…