第十五届蓝桥杯C++B组省赛

在这里插入图片描述

文章目录

  • 1.握手问题
    • 解题思路1(组合数学)
    • 解题思路2(暴力枚举)
  • 2.小球反弹
    • 做题思路
  • 3.好数
    • 算法思路(暴力解法)---不会超时
  • 4.R格式
    • 算法思路
  • 5.宝石组合
    • 算法思路---唯一分解定理
  • 6.数字接龙
    • 算法思路----DFS
  • 7.拔河
    • 算法思路

1.握手问题

题目描述:
在这里插入图片描述

解题思路1(组合数学)

按照题目描述来说,会议有五十人,如果不加任何限制条件,这五十个人两两握手的次数是:
t o t a l = 49 + 48 + 47 + . . . . . . . . + 1 total=49+48+47+........+1 total=49+48+47+........+1
利用高斯求和的得出: t o t a l = 50 ∗ 49 / 2 total=50*49/2 total=5049/2
如果加上限制条件的话,题目给定的其中有七个人不会相互握手,需要用上面总的不加限制的减去七个人相互握手的次数。
c n t = 6 + 5 + . . . . . . + 1 = 7 ∗ 6 / 2 cnt=6+5+......+1=7*6/2 cnt=6+5+......+1=76/2
上述两式作差即可
编写代码:

#include<iostream>
using namespace std;
int main()
{int total = 50 * 49 / 2;int cnt = 7 * 6 / 2;cout << total - cnt << endl;return 0;
}

解题思路2(暴力枚举)

将每个人握手的情况枚举出来即可。

#include<iostream>
using namespace std;
int main()
{int ans = 0;for (int i = 1;i <= 50;i++){for (int j = i + 1;j <= 50;j++){//排除掉七人的情况if (!(i >= 1 && i <= 7 && j >= 1 && j <= 7)){ans++;}}}cout << ans << endl;return 0;
}

2.小球反弹

问题描述:
在这里插入图片描述

做题思路

这道题我们肯定不能直接做的,这道题给定了 d x : d y dx:dy dx:dy的值说明这道题我们应该分解来做,将小球的反弹的路径分解为x方向和y方向来做。
我们首先假设x方向上经过了p个来回,y方向上经历了q个来回,因为是分解的缘故,所以两个分解方向上的时间是相同的。
所以可以得出两个等式:
d x ∗ t = 2 p x dx*t=2px dxt=2px(由于这里一半的路程是x,所以一个来回的路程是2x,乘以来回就是总路程)
d y ∗ t = 2 q x dy*t=2qx dyt=2qx

将这两个式子进行比例
d x d y = p x q y \frac{dx}{dy}=\frac{px}{qy} dydx=qypx
得到这个式子之后我们可以利用gcd对这个式子的左边进行约分。
可以得出: p = d x ∗ y p=dx*y p=dxy q = d y ∗ x q=dy*x q=dyx
算出q或者p之后可以利用公式计算t: t = 2 p x / d x t=2px/dx t=2px/dx
最后得出总路程: 总路程 = t ∗ ( s q r t ( 1 5 2 + 1 7 2 ) ) 总路程=t*(sqrt(15^2+17^2)) 总路程=t(sqrt(152+172))

编写代码:

//求最大公约数
int gcd(int a, int b)
{return b == 0 ? a : gcd(b, a % b);
}
int main()
{//给出x方向和y方向的速度 int dx = 15, dy = 17;//给出x方向和y方向上的距离int x = 343720, y = 233333;//求出多少来回int q = dy * x, p = dx * y;//求最大公约数int g = gcd(p, q);p /= g, q /= g;//计算时间int t = 2 * p * x / dx;//求路程double ans = t * sqrt(15 * 15 + 17 * 17);printf("%.2lf\n", ans);return 0;
}

3.好数

问题描述:
在这里插入图片描述

数据量:
在这里插入图片描述

算法思路(暴力解法)—不会超时

遍历1到n的数,然后写一个check函数判断每个数是否是好数,这里的时间复杂度是 n ∗ l o g n n*logn nlogn
编写代码:

#include <iostream>
using namespace std;
int N,count;bool Check(int n)
{int i=1;while(n!=0){int tail=n%10;if(i%2==1){if(tail%2!=1)return false;}else{if(tail%2!=0)return false;}i++;n/=10;}return true;
}int main()
{// 请在此输入您的代码cin>>N;for(int i=1;i<N;i++){if(Check(i)){count++;}}cout<<count<<endl;return 0;
}

4.R格式

题目描述:
在这里插入图片描述

数据量:
在这里插入图片描述

可以看到这道题的数据量是很大的,涉及到了幂次,肯定不可能直接去算,这道题很显然是考察的是高精度算法(高精度*低精度)

算法思路

高精度模版题:

编写代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;//数组模拟高精度:高精度*低精度
const int N = 2e3 + 10;
string s;
int a[N];
int main()
{int n;cin >> n >> s;//反转操作reverse(s.begin(), s.end());//确定小数点的位置int pos = s.find(".");s.erase(pos, 1);//删除小数点,方便后续计算int len = s.size();for (int i = 0;i < len;i++)  a[i + 1] = s[i] - '0';//高精度*低精度for (int i = 1;i <= n;i++){//顺序扫描,均*2for (int j = 1;j <= len;j++) a[j] *= 2;//处理大于10的位数for (int j = 1;j <= len;j++){if (a[j] >= 10){a[j + 1]++;a[j] %= 10;if (j == len) len++;}}}//处理小数点后的第一位,进行四舍五入if (a[pos] >= 5)a[pos + 1]++;for (int i = pos + 1;i <= len;i++){if (a[i] >= 10){a[i + 1]++;a[i] %= 10;if (i == len)len++;}}//打印的时候倒序打印for (int i = len;i >= pos + 1;i--) cout << a[i];return 0;
}

5.宝石组合

题目描述:

在这里插入图片描述

数据范围:
在这里插入图片描述

首先从数据量来看这道题是不能用暴力枚举的,因为暴力枚举三个数的时间复杂度是 O ( N 3 ) O(N^3) O(N3)了。

算法思路—唯一分解定理

首先我们要知道什么是唯一分解定理,简单来说唯一分解定理就是,任意一个大于1的正整数 ,都可以唯一地表示为若干个质数的乘积,且这些质数的顺序不影响分解的唯一性。
那么可以得出:
N 1 = p 1 a 1 ⋅ p 2 a 2 ⋅ … ⋅ p n a n N_1 = p_1^{a_1} \cdot p_2^{a_2} \cdot \ldots \cdot p_n^{a_n} N1=p1a1p2a2pnan

N 2 = p 1 b 1 ⋅ p 2 b 2 ⋅ … ⋅ p n b n N_2 = p_1^{b_1} \cdot p_2^{b_2} \cdot \ldots \cdot p_n^{b_n} N2=p1b1p2b2pnbn

从上面两个式子可以得出:
gcd ⁡ ( N 1 , N 2 ) = p 1 min ⁡ ( a 1 , b 1 ) ⋅ p 2 min ⁡ ( a 2 , b 2 ) ⋅ … ⋅ p n min ⁡ ( a n , b n ) \gcd(N_1,N_2) = p_1^{\min(a_1,b_1)} \cdot p_2^{\min(a_2,b_2)} \cdot \ldots \cdot p_n^{\min(a_n,b_n)} gcd(N1,N2)=p1min(a1,b1)p2min(a2,b2)pnmin(an,bn)

lcm ⁡ ( N 1 , N 2 ) = p 1 max ⁡ ( a 1 , b 1 ) ⋅ p 2 max ⁡ ( a 2 , b 2 ) ⋅ … ⋅ p n max ⁡ ( a n , b n ) \operatorname{lcm}(N_1,N_2) = p_1^{\max(a_1,b_1)} \cdot p_2^{\max(a_2,b_2)} \cdot \ldots \cdot p_n^{\max(a_n,b_n)} lcm(N1,N2)=p1max(a1,b1)p2max(a2,b2)pnmax(an,bn)

假设Ha,Hb,Hc的分解出来的相同的质数的幂次分别是x,y,z那么可以得出:

在这里插入图片描述

上面的式子可以转换为幂次是:

x + y + z + max ⁡ ( x , y , z ) − max ⁡ ( x , y ) − max ⁡ ( x , z ) − max ⁡ ( y , z ) x+y+z+\max(x,y,z)-\max(x,y)-\max(x,z)-\max(y,z) x+y+z+max(x,y,z)max(x,y)max(x,z)max(y,z)
相当于我们只需要求出上面式子的最大值即可。

编写代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
//fac是存储因子的二维数组,s是求的最大值
vector<int> fac[N], s[N];
int main()
{//遍历数组for (int i = 1;i <= 1e5;i++){for (int j = i;j <= 1e5;j += i){//i是j的因子fac[j].push_back(i);}}//输入n个数int n;cin >> n;for (int i = 1;i <= n;i++)cin >> a[i];//保证字典序最小sort(a + 1, a + n + 1);for (int i = 1;i <= n;i++){//处理i的每个因子for (int j = 0;j < fac[a[i]].size();j++){//s[fac[a[i]][j]].push_back(a[i]);}}for (int i = 1e5;i >= 0;i--){if (s[i].size() >= 3){cout << s[i][0] << ' ' << s[i][1] << ' ' << s[i][2] << endl;break;}}return 0;
}

6.数字接龙

问题描述:

在这里插入图片描述
在这里插入图片描述
数据量:
在这里插入图片描述
根据数据量来看这道题考察的应该是DFS,但是在DFS中应该还涉及到回溯,因为当走到不满足条件的时候需要进行回溯。

算法思路----DFS

编写代码:

#include<iostream>
#include<string>
using namespace std;
const int N = 20;
int a[N][N];
bool vis[N][N];
int n, k;
//方向数组:   0  1 2 3 4 5 6  7
int dx[8] = { -1,-1,0,1,1,1,0,-1 };
int dy[8] = { 0,1,1,1,0,-1,-1,-1 };
string res;void dfs(int x, int y, int prev, string s, int dep)
{//当搜到终点的时候,且搜索深度是n的时候,意思就是每种情况都搜索完了if (x == n && y == n && dep == n * n) {if (res.empty())res = s;return;}for (int i = 0;i < 8;i++){//生成邻接点int bx = x + dx[i];int by = y + dy[i];//过滤越界节点if (bx<1 || bx>n || by<1 || by>n)continue;//过滤访问过的节点if (vis[bx][by] == true)continue;//防止交叉搜索if (i == 1 && vis[x - 1][y] && vis[x][y + 1])continue;if (i == 3 && vis[x + 1][y] && vis[x][y + 1])continue;if (i == 5 && vis[x + 1][y] && vis[x][y - 1])continue;if (i == 7 && vis[x - 1][y] && vis[x][y - 1])continue;//保证路径数值为0 1 2 3 .....k-1if ((a[bx][by] < k && a[bx][by] == prev + 1) || (prev + 1 == k && a[bx][by] == 0)){//可以搜索,将点标记为truevis[bx][by] = true;dfs(bx, by, a[bx][by], s + to_string(i), dep + 1);//最优性剪枝if (!res.empty())return;vis[bx][by] = false;//回溯}}
}int main()
{cin >> n >> k;for (int i = 1;i <= n;i++)for (int j = 1;j <= n;j++)cin >> a[i][j];string emp;//标记起点vis[1][1] = true;dfs(1, 1, 0, emp, 1);if (res.empty())cout << -1;else cout << res << endl;return 0;
}

7.拔河

问题描述:
在这里插入图片描述
数据量:
在这里插入图片描述
对于这种涉及到区间和的题来说,大概率都是用前缀和算法解决

算法思路

编写代码:

#include<iostream>
#include<set>
#include<climits>
using namespace std;#define ll long longconst int N = 1e3 + 10;
int a[N], s[N];//前缀和和数组
multiset<int> ms;int main()
{int n;cin >> n;for (int i = 1;i <= n;i++){cin >> a[i];//前缀和s[i] = s[i - 1] + a[i];}//用set去维护所有的区间和for (int i = 1;i <= n;i++){for (int j = 1;j <= n;j++){//维护区间和ms.insert(s[j] - s[i - 1]);}}int ans = LONG_MAX;for (int i = 1;i <= n;i++){for (int j = 1;j < i;j++){//枚举以i结尾的区间,因为这里i-1只会有一个人,所以应该是j-1int sum = s[i] - s[j - 1];//找到与该区间和sum相似的区间和auto it = ms.lower_bound(sum);if (it != ms.end()){ans = min(ans, abs(*it - sum));}if (it != ms.begin()){it--;ans = min(ans, abs(*it - sum));}}//删除以i开头且以j结尾的区间,防止后续查询区间的时候出现区间重叠/交叉问题for (int j = i;j <= n;j++) ms.erase(ms.find(s[j] - s[i - 1]));}cout << ans << endl;return 0;
}

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

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

相关文章

分布式数据库的进度管理:TiDB 备份恢复工具 PiTR 的原理与实践

导读 对于一款企业级数据库产品而言&#xff0c;数据的安全性和可恢复性是至关重要的。PiTR&#xff08;Point in Time Restore&#xff09;作为 TiDB 备份工具的核心功能之一&#xff0c;提供了一种精细的数据恢复能力&#xff0c;允许用户将数据库集群恢复到过去的任意时间点…

C语言 | 第十六章 | 共用体 家庭收支软件-1

P 151 结构体定义三种形式 2023/3/15 一、创建结构体和结构体变量 方式1-先定义结构体&#xff0c;然后再创建结构体变量。 struct Stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩 }; struct Stu stu1, stu2; //…

基于SpringBoot+Vue+Uniapp的植物园管理小程序系统(2024最新,源码+文档+远程部署+讲解视频等)

3. 论文参考 4. 项目运行截图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring …

Spring Boot在知识管理中的应用

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

数据检测和响应:DDR 用于数据安全

数据检测和响应 (DDR) 用于主动数据安全态势管理 企业必须保护其数据免受网络攻击&#xff0c;主要有三个原因&#xff1a; 1. 公司有法律义务保证客户信息的安全&#xff1b; 2. 不这样做会损害公司的声誉&#xff1b; 3. 补救数据泄露的影响可能代价高昂&#xff0c;而且…

数据结构前置知识(上)

1. 初识集合框架 1.1 什么是集合框架 在了解集合框架之前,我们先来认识一下数据结构,所谓数据结构就是描述和组织数据的一个东西. 那什么是集合框架呢?在java里面集合框架(Java Collection Framework),又被称为容器container,说白了就是很多个接口,抽象类,实现类组成的一个包,…

架构设计笔记-12-信息系统架构设计理论与实践

目录 知识要点 案例分析 1.Java企业级应用系统 2.c/s架构&#xff0c;b/s架构 知识要点 软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一类架构所共有的特征&#xff0c;主要包括架构定义、架构词汇表和架构约束。 数据挖掘是从数据库的大…

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署

OceanBase 4.x 版本支持2种部署模式&#xff1a;单机部署与分布式部署&#xff0c;同时支持从单机平滑扩展至分布式架构。这样&#xff0c;可以有效解决小型业务向大型业务转型时面临的扩展难题&#xff0c;降低了机器资源的成本。 以下将详述如何通过命令行&#xff0c;实现集…

解决IPv6网络引起的网页与程序卡顿问题-本地DNS解析方案

一、问题环境 连接IPv6WiFi网络时&#xff0c;易出现网页打不开&#xff0c;程序开启无法加载画面。系统环境为Win10。 二、解决思路 在用户端无法触及路由器、网关等管理资源时&#xff0c;只能从本地环境中更改配置。多适用于公共WiFi&#xff0c;私人WiFi可直接从路由器DNS、…

手撕数据结构 —— 队列(C语言讲解)

目录 1.什么是队列 2.如何实现队列 3.队列的实现 Queue.h中接口总览 具体实现 结构的定义 初始化 销毁 入队列 出队列 取队头元素 取队尾元素 判断是否为空 获取队列的大小 4.完整代码附录 Queue.h Queue.c 1.什么是队列 队列是一种特殊的线性表&#xff0…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

Aria2Cloudreve任意文件写入到RCE

什么是Aria2 Aria2 是一个轻量级的命令行下载工具&#xff0c;支持多种下载协议&#xff0c;如 HTTP、FTP、SFTP、BitTorrent 和 Metalink。它以其强大的多源下载能力而著称&#xff0c;可以同时从多个服务器或对等节点下载文件&#xff0c;加快下载速度。Aria2 占用资源少&am…

【C++】拆分详解 - vector

文章目录 一、vector的介绍二、vector的使用1. 构造2. 迭代器3. vector 空间增长问题4. 增删查改5. vector 迭代器失效问题5.1 底层空间改变&#xff08;扩容、缩容&#xff09;5.2 指定位置元素的删除操作5.3 Linux与VS平台差异 三、vector 模拟实现0. 整体框架1. 构造 / 析构…

图解 微信开发者工具 小程序源码 调试、断点标记方法 , 微信小程序调试器,真机调试断点调试方法,小程序网络API请求调试方法 总结

在我们使用微信开发者工具进行微信小程序开发的时候&#xff0c;在这个微信开发者工具的代码编辑框里面我们是无法像使用vscode, idea等IDE工具时那样直接对代码打断点进行调试&#xff0c; 原因是小程序实际上他就是一个web浏览器应用的包装, 在其内部使用的还是类似chrome的…

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用。 类别&#xff1a;塔吊(Tower-crane) 一种 训练数据已划分&#xff0c;配置文件稍做路径改动即可训练。 训练集&#xff1a; 4724 &#xff08;正面3224 负面1500&#xff09; 验证集&#xf…

C#实现Punycode编码/解码

测试代码 string word "我爱你"; string idn "我爱你.中国"; string wordCode PunyCode.Encode(word); string punycode PunyCode.IDN2Punycode(idn);Console.WriteLine(word); Console.WriteLine(wordCode); Console.WriteLine(PunyCode.Decode(word…

外卖点餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;外卖员管理&#xff0c;餐厅管理&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;外卖订单管理&#xff0c;订单配送管理 微信端账号功能包括&#xff1a;系统首页…

OKHTTP 如何处理请求超时和重连机制

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…