【蓝桥杯】十五届省赛B组c++

目录

前言

握手问题

分析

排列组合写法

枚举

小球反弹

分析

代码

好数

分析

代码

R 格式

分析

代码

宝石组合

分析

代码

数字接龙

分析

代码

拔河

分析

代码

总结


前言

主播这两天做了一套蓝桥杯的省赛题目(切实感受到了自己有多菜)。


握手问题


分析

填空题的第一道,很简单,不过主播第一次错了(原因是把方案数的+想成了*,被自己蠢笑了)。

这道题如果有一些排列组合的基础的话应该很容易想到答案就是7加到49

但这不代表没有排列组合的基础就不会,依然可以写对这道题。(枚举)


排列组合写法

#include<iostream>
using namespace std;
int l;
​
int main()
{for(int i = 7; i <= 49; i++)l += i;cout << l;
}

枚举

#include<iostream>
using namespace std;
int l;
int main()
{for(int i = 1; i <= 50; i++)for(int j = i + 1; j <= 50; j++){if(i <= 7 && j <= 7) continue; //选定七个人不握手l++;}cout << l;
}

小球反弹


分析

这道题主播依旧没有写出来()

物理题,首先将速度分解到xy两个方向,随后整个运动过程就可以看作在x轴上来回运动的同时y轴上来回运动

假设在x轴上经过a个来回y轴上经过b个来回回到原点,可得:
2ax/dx = 2by/dy

移项:
a/b = dx * y/ dy * x

随后我们对a / b进行约分,即:a / gcd(a, b), b / gcd(a, b)

随后再根据路程和速度即可得出:t = 2ax / dx

最后通过t * v求出路程。


代码

#include<iostream>
#include<cmath>
using namespace std;
int x = 343720, y = 233333;
int dx = 15, dy = 17;
​
int gcd(int a, int b)
{if(b == 0) return a;return gcd(b, a % b);
}
int main()
{int a = y * dx, b = x * dy;a /= gcd(a, b); //约分double t = 2.0 * a * x / dx; //时间
​printf("%.2lf", t * sqrt(dx * dx + dy * dy));
​return 0;
}

好数


分析

观察数据量——1e7枚举每一位的话最大是7 * 1e7,小于1e8所以直接暴力枚举计数即可。(这个主播最开始也是没有想到,去写模拟了)

代码

#include<iostream>
using namespace std;
int l, n;
​
int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){int j = 1, k = i;l++;while(k){if((j & 1) != (k & 1)){l--;break;}j++;k /= 10;}}printf("%d", l);return 0;
}

R 格式


分析

发现n很大d也很大,所以考虑高精度

这道题主要考察了对浮点数的高精度写法,可以在最开始忽略掉小数点,随后进行累乘(高精度 * 低精度)再最后手动进位(高精度 + 低精度)

主播最开始还去写了高精度*高精度QAQ,最后发现根本没必要,真是蠢到家了。


代码

#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int n;
string l;
vector<int> A, B;
​
vector<int> cur(vector<int>& A, int b)
{int x = 0;vector<int> C;for(int i = 0; i < A.size(); i++){x += A[i] * b;C.push_back(x % 10);x /= 10;}while(x){C.push_back(x % 10);x /= 10;}return C;
}
​
vector<int> add(vector<int>& A, vector<int> B)
{int x = 0;vector<int> C;for(int i = 0; i < A.size() || i < B.size(); i++){if(i < A.size()) x += A[i];if(i < B.size()) x += B[i];C.push_back(x % 10);x /= 10;}if(x) C.push_back(1);return C;
}
​
int main()
{cin >> n >> l;for(int i = l.size() - 1; i >= 0; i--){if(l[i] == '.') continue;A.push_back(l[i] - '0'); //先不考虑小数点}for(int i = 1; i <= n; i++)A = cur(A, 2); //乘法计算.// 四舍五入int i = 0;for(; i < l.size(); i++)if(l[i] == '.') break; //找到小数点位置
​int x = 0;int d = l.size() - 1 - i; //小数部分reverse(A.rbegin(), A.rend()); //反转for(int k = 0; k < l.size() - 1 - i; k++){x = A.back();A.pop_back();} //消除小数部分reverse(A.rbegin(), A.rend()); //反转if(x >= 5)A = add(A, {1}); //进位for(int i = A.size() - 1; i >= 0; i--)printf("%d", A[i]);return 0;
}

宝石组合


分析

题意很简单,这道题的主要难点就在于公式的推导。
S = H_aH_bH_c * LCM(H_a, H_b, H_c) / (LCM(H_a, H_b)*LCM(H_a, H_c)*LCM(H_b,H_c))

公式的推导有两种方法,因为主播目前只熟悉一种所以就按照这个思路来讲了。

公式推导基于算数基本定理

我们将每一项进行质因数分解可得到
H_a = p_1^{c_1} * p_2^{c_2} * ... p_n^{c_n}

同理将Hb于Hc分解质因数可得
H_a = p_1^{e_1} * p_2^{e_2} * ... p_n^{e_n}
H_a = p_1^{d_1} * p_2^{d_2} * ... p_n^{d_n}

我们按照质数进行因式分解,取出其中的一项可得:
p_1^{c_1} * p_1^{d_1} * p_1^{e_1} * p_1^{max(c_1, d_1, e_1)} / (p_1^{max(c_1, d_1)} * p_1^{max(c_1, e_1)} * p_1^{max(d_1, e_1)})

随后我们消掉maxmin函数,设c1 > d1 > e1,可得:
p^{e_1}


e_1 = min(c_1, d_1, e_1)

满足最大公因数的条件,我们最后将公式整合可得:
S = gcd(H_a, H_b, H_c)

至此我们完成了本道题的第一步

随后我们来查找max(gcd(Ha, Hb, Hc))

显然对于本道题直接枚举的话会超时,如何来做呢?

可以发现H很小且gcd < H,所以我们可以直接枚举约数


代码

#include<iostream>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){int x; scanf("%d", &x);a[x]++; //存储出现次数}for(int i = N - 1; i; i--)           {int l = 0;for(int j = i; j < N; j += i)l += a[j];if(l >= 3){l = 0;for(int j = i; j < N && l < 3; j += i)for(int k = 0; k < a[j] && l < 3; k++, l++)printf("%d ", j);break;}}return 0;
}

数字接龙


分析

发现数据量很小所以直接搜索就好。

对于本道题的一个细节是如何判断交叉

主播的建议是存储一个这样的值:read[x + dx][y + dy]

数组内的两个参数是起始坐标终止坐标

这样写为什么是正确的呢?

因为只有斜着走的时候才有可能出现交叉的情况,所以每个方向的步长都是1

很容易发现两个方向是一个奇数和一个偶数,和一定是一个奇数,而若将一个奇数分解为两个相差为1的数字只有两种情况(交换位置)。对于本道题来说正合适。所以写一个这样的数组就可以避免交叉。


代码

#include <iostream>
#include <cstring>
#include <vector>
#define s second
#define f first
using namespace std;
typedef pair<int, int> PII;
const int N = 15;
int n, p;
int map[N][N];
vector<int> to[N][N]; //存储能够到达哪个点,显著降低时间复杂度的小小小优化。
bool read[N][N];
bool cun[2 * N][2 * N]; //防止交叉
vector<int> vtr;
PII s[] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; //八个方向
​
bool dfs(int x, int y, int k)
{if(x == n && y == n && vtr.size() == n * n - 1){for(int i = 0; i < vtr.size(); i++)printf("%d", vtr[i]);return true;}if(x == n && y == n) return false;for(int i : to[x][y]){int dx = x + s[i].f, dy = y + s[i].s;if(read[dx][dy] == false) //第一层筛选{if(i & 1 == 0 || cun[x + dx][y + dy] == false) //无交叉{read[dx][dy] = true;if(i & 1) cun[x + dx][y + dy] = true;vtr.push_back(i);if(dfs(dx, dy, (k + 1) % p))return true;vtr.pop_back();if(i & 1) cun[x + dx][y + dy] = false;read[dx][dy] = false;}}}return false;
}
​
int main()
{memset(map, 0x3f, sizeof map);scanf("%d%d", &n, &p);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)scanf("%d", &map[i][j]);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)for(int k = 0; k < 8; k++){int dx = i + s[k].f, dy = j + s[k].s;if(map[dx][dy] == (map[i][j] + 1) % p)to[i][j].push_back(k); }read[1][1] = true;if(!dfs(1, 1, 1))printf("-1");return 0;
}

拔河


分析

最开始以为是dp但是后来发现我想多了。

题目要求两个不相交的区间的差值最小,可以发现无论两个区间又无相交情况差值都是不变的,所以问题就转化成了差值最小的区间问题

套用模板——首先求出所有区间的和,随后sort之后差值最小的必然会在相邻的两个区间上产生。当然对于本题需要考虑结果是否合法,即:一个区间不可以完全包含另一个区间。(使用区间取交集模板即可)


代码

#include<iostream>
#include<vector>
#include<algorithm>
#define s second
#define f first
using namespace std;
typedef long long LL;
​
typedef pair<LL, pair<int, int>> PIII;
using namespace std;
const int N = 2010;
int n;
LL s[N];
vector<PIII> vtr; 
​
bool cmp(pair<int, int> A, pair<int, int> B)
{int x = max(A.f, B.f);int y = min(A.s, B.s); //查看有没有交集return x == A.f && y == A.s || x == B.f && y == B.s;
}
​
int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%lld", s + i);s[i] += s[i - 1];}LL cnt = 0x3f3f3f3f3f3f3f3f;for(int i = 1; i <= n; i++)for(int j = i; j <= n; j++)vtr.push_back({s[j] -  s[i - 1], {i, j}});sort(vtr.begin(), vtr.end());for(int i = 1; i < vtr.size(); i++)if(!cmp(vtr[i].s, vtr[i - 1].s))cnt = min(cnt, vtr[i].f - vtr[i - 1].f);printf("%lld", cnt);return 0;
}

总结

最后附上ak截图

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

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

相关文章

必刷算法100题之计算右侧小于当前元素的个数

题目链接 315. 计算右侧小于当前元素的 个数 - 力扣&#xff08;LeetCode&#xff09; 题目解析 计算数组里面所有元素右侧比它小的数的个数, 并且组成一个数组,进行返回 算法原理 归并解法(分治) 当前元素的后面, 有多少个比我小(降序) 我们要找到第一比左边小的元素, 这…

Hyperlane框架:下一代高性能Rust Web框架 [特殊字符]

Hyperlane框架&#xff1a;下一代高性能Rust Web框架 &#x1f680; 引言 &#x1f44b; 在当今快速发展的Web开发领域&#xff0c;性能和开发效率的平衡变得越来越重要。Hyperlane作为一个新兴的Rust Web框架&#xff0c;完美地解决了这个问题。本文将带您深入了解Hyperlane…

图像处理:使用Numpy和OpenCV实现傅里叶和逆傅里叶变换

文章目录 1、什么是傅里叶变换及其基础理论 1.1 傅里叶变换 1.2 基础理论 2. Numpy 实现傅里叶和逆傅里叶变换 2.1 Numpy 实现傅里叶变换 2.2 实现逆傅里叶变换 2.3 高通滤波示例 3. OpenCV 实现傅里叶变换和逆傅里叶变换及低通滤波示例 3.1 OpenCV 实现傅里叶变换 3.2 实现逆傅…

OpenEuler/CentOS一键部署OpenGauss数据库教程(脚本+视频)

&#x1f4cc;OpenEuler/CentOS一键安装OpenGauss数据库教程 为什么需要OpenGauss一键安装脚本&#xff1f; 手动部署OpenGauss数据库时&#xff0c;环境适配、依赖冲突等问题常让开发者头疼。尤其对新人而言&#xff0c;官方文档的配置步骤可能耗时数小时甚至引发未知报错。 …

如何解决 Hive 在创建 MySQL 表时出现乱码???的问题

1.问题描述 我们启动Hive建立一个学生students表格 使用desc students;查看表格结构时 发现有出现乱码的情况 2.解决方案 打开Hive安装机器上面的MySQL 切换到Hive数据库 执行以下命令修改字段注释字符集 mysql -u root -p123456;use hive;alter table COLUMNS_V2 modify col…

自定义组件触发饿了么表单校验

饿了么的表单控件&#xff0c;如果存在自定义组件更改了值&#xff0c;例如在el-from中存在原生input组件很有可能没法触发表单校验&#xff0c;下拉框或者弹框组件仍然是报红边框。 这是因为饿了么的输入框或者下拉框更改值的时候会自动触发表单校验&#xff0c;但是封装过后的…

架构思维:查询分离 - 表数据量大查询缓慢的优化方案

文章目录 Pre引言案例何谓查询分离&#xff1f;何种场景下使用查询分离&#xff1f;查询分离实现思路1. 如何触发查询分离&#xff1f;方式一&#xff1a; 修改业务代码&#xff1a;在写入常规数据后&#xff0c;同步建立查询数据。方式二&#xff1a;修改业务代码&#xff1a;…

Linux开发工具——make/makefile

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux开发工具——make/makefile&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xf…

python加载训练好的模型并进行叶片实例分割预测

要基于“GMT: Guided Mask Transformer for Leaf Instance Segmentation”进行代码复现&#xff0c;可按照以下步骤利用Python实现&#xff1a; 环境配置 克隆仓库&#xff1a;在终端中使用git clone https://github.com/vios-s/gmt-leaf-ins-seg.git命令&#xff0c;将项目代…

AI平台初步规划实现和想法

要实现一个类似Coze的工作流搭建引擎&#xff0c;可以结合SmartEngine作为后端工作流引擎&#xff0c;ReactFlow作为前端流程图渲染工具&#xff0c;以及Ant Design作为UI组件库。以下是实现的步骤和关键点&#xff1a; ### 1. 后端工作流引擎&#xff08;SmartEngine&#xf…

Pycharm 启动时候一直扫描索引/更新索引 Update index/Scanning files to index

多个项目共用一个虚拟环境&#xff0c;有助于加快PyCharm 启动吗 chatgpt 4o认为很有帮助&#xff0c;gemini 2.5pro认为没鸟用&#xff0c;我更认可gemini的观点。不知道他们谁在一本正经胡说八道。 -------- 打开pycharm的时候&#xff0c;下方的进度条一直显示在扫描文件…

dify新版本1.1.3的一些问题

本人使用window版本上构建dify&#xff0c;采用docker方法启动 1、拉取镜像问题 windows上更改拉取镜像仓库地址 优化加速参考&#xff1a;青春不留白/Docker-hub 如果还是拉取比较慢的话&#xff0c;建议科学上网解决。 2、启动问题 发生报错Dify:failed to init dify plu…

4.2-3 fiddler抓取手机接口

安卓&#xff1a; 长按手机连接的WiFi&#xff0c;点击修改网络 把代理改成手动&#xff0c;服务器主机选择自己电脑的IP地址&#xff0c;端口号为8888&#xff08;在dos窗口输入ipconfig查询IP地址&#xff0c;为ipv4&#xff09; 打开手机浏览器&#xff0c;输入http://自己…

Spring Boot中自定义注解的创建与使用

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、握手问题-&#xff08;解析&#xff09;-简单组合问题&#xff08;别人叫她 鸽巢定理&#xff09;&#x1f607;&#xff0c;感觉叫高级了…

HTML应用指南:利用POST请求获取三大运营商5G基站位置信息(一)

在当前信息技术迅猛发展的背景下,第五代移动通信(5G)技术作为新一代的无线通信标准,正逐步成为推动社会进步和产业升级的关键驱动力。三大电信运营商(中国移动、中国联通、中国电信)在全国范围内的5G基站部署,不仅极大地提升了网络性能,也为智能城市、物联网、自动驾驶…

C++学习之线程

目录 1.进程和线程的概念 2.线程内核三级映射 3.线程优缺点 4.创建线程和获取线程ID的函数 5.创建子线程 6.循环创建N个子线程 7.子线程传参地址错误演示分析 8.主、子线程共享全局变量、堆空间 9.线程退出 10.pthread join回收线程退出值 11.pthread_cancel 12.杀死…

element-plus中,表单校验的使用

目录 一.案例1&#xff1a;给下面的表单添加校验 1.目的要求 2.步骤 ①给需要校验的el-form-item项&#xff0c;添加prop属性 ②定义一个表单校验对象&#xff0c;里面存放了每一个prop的检验规则 ③给el-form组件&#xff0c;添加:rules属性 ④给el-form组件&#xff0…

团体设计程序天梯赛L2-025 # 分而治之

文章目录 题目解读输入格式输出格式 思路Ac Code参考 题目解读 在战争中&#xff0c;我们希望首先攻下敌方的部分城市&#xff0c;使其剩余的城市变成孤立无援&#xff0c;然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序&#xff0c;判断每个方案的可…

Arduino示例代码讲解:Knock Sensor 敲击感知器

Arduino示例代码讲解:Knock Sensor 敲击感知器 Knock Sensor 敲击感知器功能概述硬件部分:软件部分:代码逐行解释定义常量定义变量`setup()` 函数`loop()` 函数工作原理Knock Sensor 敲击感知器 这段代码是一个Arduino示例程序,用于检测敲击声。它通过读取一个压电元件(p…