2023年14界蓝桥杯省赛题解

news2024/11/9 6:25:53

2023年14界蓝桥杯省赛题解

蒟蒻笔者大二,第一次省赛。总结一下:“300块没了,退钱!”

A、日期统计


问题描述

小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示:

5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3

现在他想要从这个数组中寻找一些满足以下条件的子序列:

  1. 子序列的长度为 8;
  2. 这个子序列可以按照下标顺序组成一个 yyyymmdd 格式的日期,并且要求这个日期是 2023 年中的某一天的日期,例如 20230902,20231223。yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。

请你帮小蓝计算下按上述条件一共能找到多少个不同 的 2023 年的日期。对于相同的日期你只需要统计一次即可。

答案:235

暴力枚举就可以了,比赛的时候没看到子序列,直接跑题hhhhh😭。

省赛过去了,看看题目就会了,以下是线下写的,关键一写还对了,真难过

时间复杂度:近似O(n 4),因为前四个for只找一个数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int maxl = 1e5 + 7;

int a[maxl], t[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//月份
set<string> st;//存日期
char ch[4];//格式化的日期

int main(){
	for (int i = 0; i < 100; i++)	cin >> a[i];//存数
	
	for (int i = 0; i < 100; i++){
		if (a[i] != 2 )	continue;
		for (int j = i + 1; j < 100; j++){
			if (a[j] != 0)	continue;
			for (int k = j + 1; k < 100; k++){
				if (a[k] != 2)	continue;
				for (int l = k + 1; l < 100; l++){
					if (a[l] != 3)	continue;//前4个for循环,表示不是2023直接跳过
					for (int m = l + 1; m < 100; m++){
						for (int n = m + 1; n < 100; n++){
							for (int o = n + 1; o < 100; o++){
								for (int p = o + 1; p < 100; p++){
									int month = a[m] * 10 + a[n];//这里把月份求出来
									if (month <= 0 || month	> 12)	continue;//如果不是1-12月,就不成立
									int day = a[o] * 10 + a[p];//这里把天数写出来
									if (day > t[month] || day < 1)	continue;//最大不能超过当月最大日期,最小不能小于1
									sprintf(ch, "%02d%02d", month, day);//因为2023是一样的笔者就只格式化了月份和天数。最后就是格式化字符串函数,不会的值得学一学,可以省很多事
									st.insert(ch);//把格式好的日期存到set中去重
								}
							}
						}
					}
				}
			} 
		}
	}
	//for (string va : st)	cout << va << endl;//打印有哪些日期
	cout << st.size() << endl;//打印个数
    return 0;
}
/*
5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9
5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5
8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4
6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 
8 0 9 1 2 8 5 0 2 5 3 3
20230101
*/

B、01串的熵


问题描述

请添加图片描述

答案:11027421

这题笔者做对了,5分到手!笔者还算幸运,虽然笔者也不知到算log2 的函数,但是被笔者试出来了,还算幸运把!😝

以下是笔者的,比赛上的代码,双手奉上!

时间复杂度:O(n),最大值是23333333也就是1e8的数量级,直接枚举即可

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
typedef unsigned long long ull;
const int mod = 1e9 + 7;
const int maxl = 1e5 + 7;

int total = 23333333;
//11027421
double ans = 11625907.5798;
int main(){
	for (int i = 1; i <=  total ; i++){
		double a = (double) i / total , b = (double)(total - i) / total, sum;//a、b是各自的占比
		
		sum = -(i* (a * log2(a)) + (total - i) * (b * log2(b)));//算出来的值
		
		if (abs(sum - ans) <= 1e-4 ){//浮点数的判断方法
			cout <<i <<'\t' << (total - i) <<endl;
		}
	}
	return 0;
}

C、冶炼金属


请添加图片描述
请添加图片描述

题解:

笔者写的时候看这1e4的数据,立马条件反射是二分。但是数据过不去(c语言网的,只能过样例😑)哎,应该是写错了。

对于标准写法,个人认为应该要看懂以下几个问题:

  1. 所取得最大值应该是a/b的最小值
  2. 从a/(b + 1) , 开始寻找第二个值

时间复杂度:O(n2),1e4的数据范围,正常来说过不了。但是他的第二重for循环,并没有遍历n次,因此可以过

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int maxl = 1e5 + 7;

int n, a, b, maxv = 1e9 + 7, minv = 0;

void slove(){
	cin >> n;
		for (int i = 0; i < n; i++){
			cin >> a >> b;
			maxv = min(maxv, a/b);//上限收紧 满足每组数据 
			int c = a/(b + 1);
			while (a/c != b)	c++;
			minv = max(minv, c);//下限上调 满足每组数据
		}
		cout << minv << " " << maxv << endl;
} 
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int t = 1;
//	cin >> t;
	while (t--){
		slove();
	}
    return 0;
}
/*
3
75 3
53 2
59 2
*/

D、飞机降落


问题描述:

请添加图片描述
请添加图片描述

题解:

笔者写过的题目好像有类似的,贪心题。哎,不说了,错了、错了。直接面向样例编程了。哈哈哈…😅

正经题解。用全排列模板爆搜就可以过了。学长说数据范围就10肯定爆搜啊!

时间复杂度:N、T的数据范围为10,最大的话也就10*10!能过!

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int maxl = 1e5 + 7;

int n, T[maxl], D[maxl], L[maxl];
bool vis[maxl];

bool dfs(int step, int nowT){
	if (step == n)	return true;
	
	bool flag = 0;//标记 
	for (int i = 0; i < n; i++){
		if (!vis[i]){
			if (nowT > T[i] + D[i])	return false;//如果现在的时间超过了最大起飞时间,则就直接返回 
			vis[i] = !vis[i];
			int nextT = (nowT < T[i]) ? T[i] + L[i] : nowT + L[i];//下次起飞时间:如果现在的起飞时间小于下一个飞机的到达时间,则以现在的到达时间为准,反之以现在的飞机到达时间为准 
			flag |= dfs(step + 1, nextT);//这么多种情况,有一种情况可以就为真 
			vis[i] = !vis[i];
		}
	}
	return flag;//反回flag 
}
void slove(){
	memset(vis, 0, sizeof(vis));
	cin >> n;
	for (int i = 0; i < n; i++)	cin >> T[i] >> D[i] >> L[i];
	cout << (dfs(0, 0) ? "YES" : "NO") << endl;//简单判断一下 
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int t = 1;
	cin >> t;
	while (t--){
		slove();
	}
    return 0;
}
/*
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
*/

E、接龙数列


请添加图片描述
请添加图片描述

题解:

作者写的最长上升子序列的板子。完美掉进坑里😐。

正经题解:

  1. 由“删除最少的数”,可得所求的是最长接龙数列的个数
  2. 其实题目已经把递推式给出了,当前状态是以**“Ai结尾的数字”转移到“Ai开头的数字”**
  3. 那么可设dp下标的含义为:dp[i]是以数字i开头的最长接龙序列。
  4. 遍历顺序:从前往后
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int maxl = 1e5 + 7;

int n, maxlen;
string s;
int dp[maxl];//dp[i]是以数字i开头的最长接龙序列。

void slove(){
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s;
		int pre = s[0] - '0';//第一个数字 
		int now = s.back() - '0';//最后一个数字 
		dp[now] = max(dp[now], dp[pre] + 1);//看上一个接龙数列,和现在的接龙数列谁长 
	}
	for (int i = 0; i < 10; i++)	maxlen = max(maxlen, dp[i]);//看看是以那个数字开头,接龙数列最长 
	cout << n - maxlen;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int t = 1;
//	cin >> t;
	while (t--){
		slove();
	}
    return 0;
}
/*
5
11 121 22 12 2023
*/

F、岛屿个数


请添加图片描述

在这里插入图片描述
在这里插入图片描述

题解:

笔者只会普通的bfs、dfs模板。这真上难度了。笔者真不会😔。笔者还在想到底怎么才能判断环的个数😶‍🌫️。想不明白

正经题解:

  1. 如何判断环、并且判断是否在另一个环内。

    1. 从地图外的一个地方,用bfs标记所有的海水联通的地方。这样就可以找出每个单独的岛屿(不算子岛屿)。
    2. 再遍历子岛屿的个数,并且把遍历过的岛屿标记。

    答:形象的说就是“发动一场洪水没被淹到的地方就是环内” —— 好好理解吧🤮。建议直接看操作,怎么个淹法。

  2. 然后就是基本的bfs或者dfs。不会的话可以看这道题P1596 [USACO10OCT]Lake Counting S ,可以说就是这道题的子题了。会那道题,再来看这道题会好很多

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int maxl = 1e2 + 7;
struct point{
	int x, y;
};

int n, m, ans = 0;
char g[maxl][maxl];
int flag[maxl][maxl];//这里用int是因为有3种状态要表示。0 -- 海水、1 -- 陆地、2 -- 环外 
int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};
queue<point> q;
point tp;

void bfs1(){//标记外围海水联通的地方 , 找出每个单独的岛屿(不算子岛屿)。
	q.push({0, 0});//我们选一个地图外的地方加入队列 
	flag[0][0] = 1;//标记来过 
	
	while (!q.empty()){
		tp = q.front();
		q.pop();
		
		for (int i = 0; i < 8; i++){
			int x = tp.x + dx[i];
			int y = tp.y + dy[i];
			if (x < 0 || y < 0 || x > n + 1 || y > m + 1 || g[x][y] != '0' || flag[x][y])	continue;//这里的意思是:比地图大一圈、是海水、没被标记过 
			flag[x][y] = 1;//进行标记 
			q.push({x, y});
		}
	}
}

void bfs2(int x0, int y0){//标记单个岛屿 
	flag[x0][y0] = 1;//把岛屿边放进去 
	q.push({x0, y0});
	
	while (!q.empty()){
		tp = q.front();
		q.pop();
		
		for (int i = 0; i < 4; i++){
			int x = tp.x + dx[i];
			int y = tp.y + dy[i];
			if (x < 1 || y < 1 || x > n || y > m || flag[x][y])	continue;
			flag[x][y] = 1;
			q.push({x, y});
		}
	}
}

void slove(){
	memset(flag, 0, sizeof(flag));//初始化 
	memset(g, '0', sizeof(g)); //每个点都赋为海水 
	ans = 0; 
	
	cin >> n >> m;
	for (int i = 1; i <= n; i++){//地图是从1-n 
		for (int j = 1; j <= m; j++){//地图是从1-m 
			cin >> g[i][j];
		}
	}
	bfs1();//标记外围海水 

	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			if (!flag[i][j] && g[i][j] == '1'){ 
				ans++;
				bfs2(i, j);//标记该岛屿内的子岛屿和 海水 
			}
		}
	}

	cout << ans << endl;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int t = 1;
	cin >> t;
	while (t--){
		slove();
	}
    return 0;
}
/*
2
5 5
01111
11001
10101
10001
11111
5 6
111111
100001
010101
100001
111111
*/

G、子串简写


问题描述

在这里插入图片描述
在这里插入图片描述

笔者暴力模拟的,学了一年就会模拟😂

正经题解:

  1. 存以c2结尾的下标。
  2. 遍历字符串s,如果是c1则就查找最近的c2结尾的下标。
  3. 加上结果,输出。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int maxl = 1e5 + 7;

int k, ans = 0;
string s;
char c1, c2;
vector<int> pos;//用vector好求下标、不用再开数组了 

void slove(){
	cin >> k >> s >> c1 >> c2;
	for (int i = 0; i < int(s.size()); i++){
		if (s[i] == c2)	pos.push_back(i);
	}
	
	int posCount = pos.size();//c2下标的个数 
	for (int i = 0; i < int(s.size()); i++){
		if (s[i] == c1){
			int l = 0, r = posCount - 1, mid;
			while (l < r){
				mid = l + ((r - l) >> 1); 
				if (pos[mid] - i + 1 >= k)	r = mid;//长度为k个 
				else	l = mid + 1;
			}
			
			if (pos[l] - i + 1 >= k)	ans += posCount - l;//这里是能找到满足要求的l,才加 
		}
	}
	cout << ans;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int t = 1;
//	cin >> t;
	while (t--){
		slove();
	}
    return 0;
}
/*
4
abababdb a b
*/

结束

蒟蒻之旅,到此结束。后面太难了,真的看不懂。😭

等下次,变成神犇了再来补上!

创作不易,点个赞吧!
最后,算了一下,笔者这次应该有个20分hhhh。交学费了。哎

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

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

相关文章

【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解&#xff0c;用于处理应用程序中的异常。当应用程序中发生异常时&#xff0c;ExceptionHandler将优先地拦截异常并处理它&#xff0c;然后将处理结果返回到前端。该注解可用于类级别和方法级别&#xff0c;…

ONNX转NCNN记录

【pytorch 转 onnx】pytorch-onnx 【onnx 转 ncnn】onnx-ncnn 【ncnn 加载模型】ncnn-load 一、python安装依赖项 pip install onnxruntime onnx opencv-python 二、创建模型并训练&#xff0c;加载模型参数并输出onnx #### pytorch 转 onnx import torch import torch.onnx…

小白学Pytorch系列- -torch.distributions API Distributions (1)

小白学Pytorch系列- -torch.distributions API Distributions (1) 分布包包含可参数化的概率分布和抽样函数。这允许构造用于优化的随机计算图和随机梯度估计器。这个包通常遵循TensorFlow分发包的设计。 不可能通过随机样本直接反向传播。但是&#xff0c;有两种主要方法可以…

【华为机试真题详解JAVA实现】—矩阵乘法

目录 一、题目描述 二、解题代码 一、题目描述 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的 矩阵的大小不超过100*100 输入描述: 第一行包含一个正整数x,代表第一个矩阵的行数 第二行…

APP测试弱网测试

1、为什么要做弱网测试 当前APP网络环境比较复杂&#xff0c;网络制式有2G、3G、4G网络&#xff0c;还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异&#xff0c;都会对用户使用app造成一定影响。 另外&#xff0c;当前app使用场景多变&#xff0c;如进地铁、上公交、…

【Linux】进程理解与学习Ⅳ-进程地址空间

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…

跟姥爷深度学习1 浅用tensorflow做个天气预测

一、前言 最近人工智能、深度学习又火了&#xff0c;我感觉还是有必要研究一下。三年前浅学了一下原理没深入研究框架&#xff0c;三年后感觉各种框架都成熟了&#xff0c;现成的教程也丰富了&#xff0c;所以我继续边学边写。原教程链接&#xff1a; 第一章&#xff1a;tens…

Linux- 系统随你玩之--玩出花活的命令浏览器下

文章目录1、背景2、常规操作2.1、测试相关2.1.1、修改 HTML 请求标头2.1.2、 模拟不同浏览器发出2.1.3、重定向2.2、 下载相关操作2.2.1、 后台下载2.2.2、设置下载重试次数2.2.3、过滤指定格式下载2.2.4、限制总下载文件大小2.2.5、匿名FTP下载2.2.6、FTP认证下载2.2.7、利用代…

(链表专题) 725. 分隔链表 ——【Leetcode每日一题】

725. 分隔链表 给你一个头结点为 head 的单链表和一个整数 k &#xff0c;请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺…

亚马逊 CodeWhisperer: 个人免费的类似GitHubCopilot能代码补全的 AI 编程助手

1、官网 AI Code Generator - Amazon CodeWhisperer - AWS 官方扩展安装教程 2、安装VSCode 下载安装VSCode 3、VSCode安装CodeWhisperer插件 安装VSCode插件 - AWS Toolkit主侧栏&#xff0c;点击AWS &#xff0c;展开CodeWhisperer&#xff0c;点击Start 在下拉菜单中点…

【100个 Unity实用技能】 | C# 中关于补位的写法 PadLeft,PadRight 函数

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

LeetCode_101

内容提要 贪心算法 保证每次操作都属局部最优的&#xff0c;从而使得最后的结果是全局最优 全局结果是局部结果的简单求和&#xff0c;且局部结果互不相干 分配问题 分发饼干 455 简单 分发糖果 135 困难 先从左往右遍历一遍&#xff0c;如果右边孩子的评分比左边的高…

TryHackMe-Year of the Jellyfish(linux渗透测试)

Year of the Jellyfish 请注意 - 此框使用公共 IP 进行部署。想想这对你应该如何应对这一挑战意味着什么。如果您高速枚举公共 IP 地址&#xff0c;ISP 通常会不满意… 端口扫描 循例nmap 扫描结果中还有域名&#xff0c;加进hosts FTP 枚举 尝试anonymous Web枚举 有三个端…

LoRa无线通信技术之CAD介绍

信道活动检测 Lora扩频调制技术的使用在确定信道是否已被可能低于接收机噪声底限的信号。在这种情况下使用常规的RSSI方式判断显然是不切实际的。为此,信道活动检测器用于检测其他LoRaTM信号的存在。下图为通道活动检测(CAD)过程: 工作原理 Lora信道活动检测模式被设计成以最…

一站式指标平台 Kyligence Zen 功能详解

近日&#xff0c;Kyligence 正式发布一站式指标平台 Kyligence Zen GA 版本。其基于 Kyligence 核心 OLAP 能力打造&#xff0c;融合了领先企业建设指标平台的丰富实践&#xff0c;具备 ZenML 指标语言、指标目录、Excel / WPS 直连分析、模板市场等创新能力&#xff0c;将以简…

GPU受限,国内AI大模型能否交出自己的答卷?

继百度之后&#xff0c;阿里、华为、京东、360等大模型也陆续浮出水面&#xff0c;大模型军备竞赛正式开启。 4月7日&#xff0c;阿里云宣布自研大模型“通义千问”开始邀请企业用户测试体验。 4月8日&#xff0c;华为云人工智能领域首席科学家田奇现身《人工智能大模型技术高峰…

一起学 WebGL:图元的类型

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天来说说 WebGL 中的三种图元。 在 WebGL 中&#xff0c;图元有三种&#xff1a;点、线、以及三角形。 绘制的 API 为&#xff1a; gl.drawArrays(mode, first, count)这里的 mode 就是要绘制的图元类型。 我们绘制 4 个点&…

办公协作效率想提质增效,可借助开源大数据工具!

在信息爆炸式发展的今天&#xff0c;提升办公协作效率&#xff0c;让各部门的信息有效互通起来&#xff0c;做好数据管理&#xff0c;已经成为众企业提升竞争力的方式方法。那么&#xff0c;如果想要提升办公效率&#xff0c;就需要了解开源大数据工具了。在数字化发展进程中&a…

HTTP协议概述 | 简析HTTP请求流程 | HTTP8种请求方法

目录 &#x1f30f; HTTP的简单介绍 何为HTTP HTTP1.0与HTTP1.1 &#x1f30f; HTTP的请求方法 1、OPTIONS 2、HEAD 3、GET 4、POST 5、PUT 6、DELETE 7、TRACE 8、CONNECT &#x1f30f; HTTP的工作原理 &#x1f30f; HTTP请求/响应的步骤 1、客户端连接到Web…

AI 芯片的简要发展历史

随着人工智能领域不断取得突破性进展。作为实现人工智能技术的重要基石&#xff0c;AI芯片拥有巨大的产业价值和战略地位。作为人工智能产业链的关键环节和硬件基础&#xff0c;AI芯片有着极高的技术研发和创新的壁垒。从芯片发展的趋势来看&#xff0c;现在仍处于AI芯片发展的…