第十五届蓝桥杯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.rhkb.cn/news/446102.html

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

相关文章

GO网络编程(五):海量用户通信系统3:整体框架与C/S通信总体流程【重要】

这个系统其实是尚硅谷的老韩讲的&#xff08;尚硅谷网络编程项目&#xff09;&#xff0c;但是他讲得很碎片化&#xff0c;思路不够清晰&#xff0c;时间又长&#xff0c;所以要掌握还是挺难的。如果你听了他的视频&#xff0c;不去梳理系统业务流程&#xff0c;不去看代码就往…

专题十一_递归_回溯_剪枝_综合练习_算法专题详细总结

目录 1. 找出所有⼦集的异或总和再求和&#xff08;easy&#xff09; 解析&#xff1a; 方法一&#xff1a; 解法二&#xff1a; 总结&#xff1a; 2. 全排列 Ⅱ&#xff08;medium&#xff09; 解析&#xff1a; 解法一&#xff1a;只关心“不合法”的分支 解法二&…

关于Linux下C++程序内存dump的分析和工具

前言 程序崩溃令人很崩溃&#xff0c;特别是让人找不到原因的崩溃&#xff0c;但是合适的工具可以帮助人很快的定位到问题&#xff0c;在AI基础能力ASR服务开发时&#xff0c;找到了一种比较实用和简单的内存崩溃的dump分析工具breakpad&#xff0c; 可以帮助在Linux下C开发程…

QD1-P8 HTML 格式化标签(font、pre、b、strong、i、u、del、s、sub、sup)

本节学习&#xff1a;HTML 格式化标签。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p8 ‍ 一、font 标签 用途&#xff1a;定义文本的字体大小、颜色和 face&#xff08;字体类型&#xff09;。 示例 <!DOCTYPE html> <html><head><meta cha…

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…

CCF推荐被调查,这8本被标记On Hold

近两年“On Hold”期刊频出&#xff0c;作为投稿选刊风向标&#xff0c;上榜期刊一定要避雷投稿&#xff01;本期科检易学术小编盘点目前被科睿唯安官方标记为“On Hold”的计算机工程类的8本期刊&#xff0c;提醒广大学者&#xff0c;选刊需谨慎&#xff0c;注意避雷哦&#x…

Spark高级用法-内置函数

目录 读取数据 1.字符串 2.数值类 3.时间类型 4.条件判断 5.窗口函数 读取数据 # 内置数据集 from pyspark.sql import SparkSession,functions as F ss SparkSession.builder.getOrCreate()# 读取文件准尉df df ss.read.csv(hdfs://node1:8020/data/students.csv,hea…

【uniapp】使用uniapp实现一个输入英文单词翻译组件

目录 1、组件代码 2、组件代码 3、调用页面 4、展示 前言&#xff1a;使用uniapp调用一个在线单词翻译功能 1、组件代码 2、组件代码 YouDaoWordTranslator <template><view class"translator"><input class"ipttext" type"te…

JVM 内存模型与垃圾回收过程详解

JVM 内存模型与垃圾回收过程详解 文章目录 JVM 内存模型与垃圾回收过程详解1. JVM内存分区1.1 具体分区1.2 JVM内存分区的必要性 2. 垃圾回收2.1 CMS垃圾回收器2.2 G1垃圾回收器2.3 JVM垃圾回收从新生代到老年代 1. JVM内存分区 1.1 具体分区 Java虚拟机&#xff08;JVM&#…

计算机毕业设计 内蒙古旅游景点数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 Spark 大数据【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

06-ArcGIS For JavaScript-requestAnimationFrame动画渲染

文章目录 概述setInterval&#xff08;&#xff09;与setTimeout()requestAnimationFrame()requestAnimationFrame在ArcGIS For JavaScript的应用结果 概述 本节主要讲解与时间相关的三个方法setTimeout()、setInterval()和requestAnimationFrame()&#xff0c;这三个方法都属…

Java每日面试题(集合)(day18)

目录 常见的集合有哪些&#xff1f;Collection和Collections有什么区别&#xff1f;ArrayList 和 Array&#xff08;数组&#xff09;的区别&#xff1f;ArrayList 和 LinkedList 的区别是什么&#xff1f;Arraylist 和 Vector 的区别HashMap和Hashtable的区别哪些集合类是线程…

计算机丢失mfc100u.dll的5种常用解决方法分享

1.mfc100u.dll的重要性 系统运行中的应用 mfc100u.dll 文件在 Windows 系统中扮演着至关重要的角色&#xff0c;尤其是在运行基于 MFC 库开发的应用程序时。以下是 mfc100u.dll 在系统运行中的应用和重要性分析&#xff1a; 系统稳定性与兼容性的关键 mfc100u.dll 文件确保…

map和set(一)

首先模拟一下key形式类 使用的结构是搜索二叉树 结点中有左孩子和右孩子 还有一个存储的值 template <class K>struct BSTnode//搜索二叉树不支持修改 中序遍历是有序的{K _key;BSTnode<K>* _left;BSTnode<K>* _right;BSTnode(const K& key):_key(key…

adum1201数字隔离器中文资料与应用

ADuM1201是ADI公司推出的一款数字隔离器&#xff0c;其典型应用有工业自动化、通讯电源管理、医疗设备以及汽车等领域。本文将对ADuM1201数字隔离器进行详细的介绍和应用分析&#xff0c;以帮助读者更好地了解和使用该产品。 一、ADuM1201数字隔离器概述 1、基本参数 ADuM120…

卷积神经网络细节问题及知识点

一、Batch Normalization Batch Normalization&#xff08;BN&#xff0c;批归一化&#xff09; 是深度学习中的一种技术&#xff0c;主要用于加速神经网络的训练过程&#xff0c;同时提高网络的稳定性和收敛速度。它通过对每一层的输出进行归一化&#xff0c;减少梯度消失和梯…

Ubuntu安装Mysql并实现远程登录【ubuntu 24.04/mysql 8.0.39】

一、安装MySQL sudo apt update # 更新软件源 sudo apt install mysql-server -y # 安装 mysql --version # 查看版本 sudo systemctl status mysql # 查看运行状态 netstat -tln # 以数字ip形式显示mysql的tcp监听状态二、设置MySQL的root密码 sudo mysql -u root # 使…

第二十三篇:网络拥塞了,TCP/IP如何解决的?

一.显示拥塞通知 当发生网络拥塞时&#xff0c;发送主机应该减少数据包的发送量。作为IP上层协议&#xff0c;TCP虽然也能控制网络拥塞&#xff0c;不过它是通过数据包的实际损坏情况来判断是否发生拥塞。然而这种方法不能在数据包损坏之前减少数据包的发送量。 为了解决这个…

pytorch与卷积神经网络实战笔记

课程视频链接 CNN卷积神经网络算法原理 全神经网络的整体结构 输入层&#xff08;x1, x2, x3…&#xff09;->隐藏层&#xff08;全连接&#xff09;->输出层&#xff0c;整体就类似于一个函数&#xff0c;输入x&#xff0c;经过函数module(x)得到输出y的过程&#xf…

笔试算法总结

文章目录 题目1题目2题目3题目4 题目1 使用 StringBuilder 模拟栈的行为&#xff0c;通过判断相邻2个字符是否相同&#xff0c;如果相同就进行删除 public class Main {public static String fun(String s) {if (s null || s.length() < 1) return s;StringBuilder builde…