【蓝桥杯】第十四届C++B组省赛

news2025/4/26 3:20:43
头像
⭐️个人主页:@小羊
⭐️所属专栏:蓝桥杯
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述

目录

    • 试题A:日期统计
    • 试题B:01串的熵
    • 试题C:冶炼金属
    • 试题D:飞机降落
    • 试题E:接龙数列
    • 试题F:岛屿个数
    • 试题G:子串简写
    • 试题H:整数删除
    • 试题I:景区导游
    • 试题J:砍树


试题A:日期统计

在这里插入图片描述

枚举出2023年所有日期,在数组中查找。结果是:235。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int ret = 0;
	vector<int> v(100);
	for (int i = 0; i < 100; i++)
	{
		cin >> v[i];
	}
	int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	for (int i = 1; i <= 12; i++)
	{
		for (int j = 1; j <= days[i]; j++)
		{
			string s("2023");
			if (i < 10) s += "0";
			s += to_string(i);
			if (j < 10) s += "0";
			s += to_string(j);
			int k = 0;
			for (int l = 0; l < v.size() && k < 8; l++)
			{
				if ((s[k] - '0') == v[l]) k++;
			} 
			if (k == 8) ret++;
		}
	}
	cout << ret << endl;
	return 0;
}

试题B:01串的熵

在这里插入图片描述

关键是要读懂题目,0的次数比1少,数据范围也不是很大,直接从0出现0次开始枚举,中间过程中某一时刻的值是否等于题目中给定的熵。(特别注意判断浮点数相等,不能用 == 判断,只能判断其差是否在一个范围,通常都用0.1

最后答案是:11027421。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	double len = 23333333;
	double H = 11625907.5798;
	for (int i = 0; i < len / 2; i++)
	{
		double sum = 0;
		sum -= i* (i / len)*log2(i / len) + (len - i)*((len - i) / len)*log2((len - i) / len);
		if (abs(sum - H) < 0.1)
		{
			cout << i << endl;
			break;
		}
	}
	return 0;
} 

试题C:冶炼金属

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

在这里插入图片描述
解题关键:当普通金属的数目不足V时,无法冶炼。
则我们可以得出关系:B * V <= A(B + 1) * V > A,所以 V <= A / BV > A / (B + 1),我们就得到了关于V的一个左右区间,所以 Vr = min(A / B)(右区间的最小值),Vl = max(A / (B + 1) + 1)(左区间的最大值)。

注意细节,为什么 A / (B + 1) 后面还要再加1,因为 V > A / (B + 1) 不能去等号。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int vl = INT_MIN, vr = INT_MAX;
	for (int i = 0; i < n; i++)
	{
		int a, b;
		cin >> a >> b;
		vr = min(a / b, vr);
		vl = max(a / (b + 1) + 1, vl);
	}
	cout << vl << " " << vr << endl; 
	return 0;
} 

试题D:飞机降落

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目数据范围不大,可以考虑暴力枚举尝试正确答案。

  • 每架飞机可以在空中盘旋等待的时间:T[i] + D[i]
  • 即这架飞机可以降落的条件是:T[i] + D[i] >= time,time表示上一架飞机降落后的时刻;
  • 当前飞机降落的过程中,下一架飞机可能在空中盘旋等待,则 time + L[i] 时间后下一架飞机可以开始降落;也可能当前飞机降落了下一架飞机还没来,则 T[i] + L[i]时间后下一架飞机可以开始降落,两种情况下 time 要取较大值。
#include <bits/stdc++.h>
using namespace std;

int t, n;
int T[11], D[11], L[11];
bool used[11] = {}; // 标记是否安排过了当前飞机
int flag = 0; // 标记全部飞机是否安全降落

void dfs(int x, int time) // x表示安排到了第几架飞机,			
{                         // time表示前面一架飞机降落后的时间
	if (x >= n) // 根据题目要求枚举到了最后一架飞机
	{
		flag = 1;
		return;
	}
	for (int i = 0; i < n; i++) // 一架一架的尝试
	{  
		// 当前飞机还没被安排,在天上可以停留的时间>前面飞机降落的最后时间
		if (!used[i] && T[i] + D[i] >= time) 
		{
			used[i] = true; // 如果满足条件就让这个飞机降落
			// 这架飞机降落后下一架飞机可能还没来,或者后面一架飞机在天空盘旋等待
			dfs(x + 1, max(T[i], time) + L[i]);
			used[i] = false;
		}
	}
}
int main()
{
	cin >> t;
	while (t--)
	{
		cin >> n;
		for (int i = 0; i < n; i++)
			cin >> T[i] >> D[i] >> L[i];
		dfs(0, 0); // 第0架飞机在0时刻降落
		if (flag) cout << "YES" << endl;
		else cout << "NO" << endl;
		flag = 0;
	}
	return 0;
}

试题E:接龙数列

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

在这里插入图片描述

题目要求我们求最少删除几个数后剩下的序列是接龙序列,这其实是不好求的,所以我们可以正难则反,求最长接龙序列的长度,转而就得到了最少的删除个数。

定义状态 dp[i] 表示以数字 i 结尾的最长接龙序列的长度。
对于当前数,如果当前数的第一个数字可以接到前面某个数的后面,也就是当前数的第一个数字等于前面某个数的最后一位数,那么当前数就可以接到这个数后面。

状态转移:dp[i] = dp[j] + 1;其中 i 表示当前数的最后一位上的数,j 表示当前数的开头。

#include <bits/stdc++.h>
using namespace std;

int dp[10];

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> s;
		int sz = s.size();
		dp[s[sz - 1] - '0'] = max(dp[s[sz - 1] - '0'], dp[s[0] - '0'] + 1);
	}
	int ret = 0;
	for (int i = 0; i < 10; i++)
		ret = max(ret, dp[i]);
	cout << (n - ret) << endl;
	return 0;
}

试题F:岛屿个数

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

#include <bits/stdc++.h>
using namespace std;

int m, n;
char arr[51][51];
int dx[8] = {-1, 1, 0, 0, -1, 1, 1, -1};
int dy[8] = {0, 0, -1, 1, 1, 1, -1, -1};
bool used[51][51];

bool check(int i, int j)
{
	for (int i = 0; i <= m; i++)
		for (int j = 0; j <= n; j++)
			used[i][j] = false;
	queue<pair<int, int>> q;
	q.push({i, j});
	used[i][j] = true;
	while (q.size())
	{
		int a = q.front().first, b = q.front().second;
		q.pop();
		for (int k = 0; k < 8; k++)
		{
			int x = a + dx[k], y = b + dy[k];
			if (x < 1 || x > m || y < 1 || y > n) return true;
			if (arr[x][y] == '0' && !used[x][y])
			{
				q.push({x, y});
				used[x][y] = true;
			}
		}
	}
	return false;
}

void dfs(int i, int j)
{
	for (int k = 0; k < 4; k++)
	{
		int x = i + dx[k], y = j + dy[k];
		if (x > 0 && x <= m && y > 0 && y <= n && arr[x][y] == '1')
		{
			arr[x][y] = '0';
			dfs(x, y);	
		} 
	}
}

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		cin >> m >> n;
		for (int i = 1; i <= m; i++)
			for (int j = 1; j <= n; j++)
				cin >> arr[i][j];
		for (int i = 1; i <= m; i++)
			for (int j = 1; j <= n; j++)
				if (arr[i][j] == '1' && !check(i, j))
					arr[i][j] = '0';
		int ret = 0;
		for (int i = 1; i <= m; i++)
			for (int j = 1; j <= n; j++)
				if (arr[i][j] == '1')
				{
					ret++;
					dfs(i, j);
				}
		cout << ret << endl;
	}
	return 0;
}

试题G:子串简写

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

根据样例,从头到尾遍历字符串统计a的个数,在这个过程中只要遇到b就把统计到的a的个数累加到结果中,因为有区间宽度限制,只要在维护的最小宽度也就是k的区间内不累加到结果中就行。

#include<iostream>
using namespace std;

long long ret = 0, cnt = 0;

int main()
{
    int k;
    cin >> k;
    string str;
    char c1, c2;
    cin >> str >> c1 >> c2;
    int l = 0, r = k - 1;
    while (1)
    {
        if (r == str.size()) break;
        if (str[l] == c1) cnt++;
        if (str[r] == c2) ret += cnt;
        l++, r++;
    }
    cout << ret << endl;
    return 0;
}

试题H:整数删除

在这里插入图片描述

在这里插入图片描述

// 样例输入
5 3
1 4 2 8 7
// 样例输出
17 7

直接模拟,只能通过部分测试用例:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n, k;
	cin >> n >> k;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
		cin >> v[i];
	while (k--)
	{
		int index = 0;
		for (int i = 0; i < v.size(); i++)
			if (v[index] > v[i])
				index = i;
		if (index - 1 >= 0) v[index - 1] += v[index];
		if (index + 1 < n) v[index + 1] += v[index];
		v.erase(v.begin() + index);
	}
	for (int e : v)
		cout << e << " ";
	return 0;
} 

使用优先级队列+双链表优化时间。

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pr = pair<ll, ll>;
const int N = 1e6;
struct { ll prev, next; } a[N]; // 记录对应位置前后的下标,方便删除
ll update[N], ret[N]; // update用于记录每个元素需要更新的值,
 					  // 需要累加的值暂时存到这个数组中
priority_queue<pr, vector<pr>, greater<pr>> pq;

int main()
{
    ll n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
    {
        ll x; cin >> x;
        a[i].prev = i - 1;
        a[i].next = i + 1;
        pq.push({x, i});
    }
    while (pq.size() > n - k)
    {
        ll v = pq.top().first, id = pq.top().second;
        pq.pop();
        if (update[id]) // id下标对应的元素有被累加过
        {
            pq.push({v + update[id], id});// 加入小堆中重新选择最小值
            update[id] = 0;
        }
        else
        {
            ll l = a[id].prev, r = a[id].next;
            // 将当前的值加到前后元素上
            update[l] += v;
            update[r] += v;
            // 删除节点
            a[l].next = r;
            a[r].prev = l;
        }
    }
    while (pq.size())
    {
        ll v = pq.top().first, id = pq.top().second;
        pq.pop();
        ret[id] = v + update[id];
    }
    for (auto e : ret)
        if (e) cout << e << " ";
    return 0;
}

试题I:景区导游

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

// 样例输入
6 4
1 2 1
1 3 1
3 4 2
3 5 2
4 6 3
2 6 5 1
// 样例输出
10 7 13 14


试题J:砍树

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

// 样例输入
6 2
1 2
2 3
4 3
2 5
6 5
3 6
4 5
4
// 样例输出
4


本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

头像

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

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

相关文章

企业级海外网络专线行业应用案例及服务商推荐

在全球化业务快速发展的今天&#xff0c;传统网络技术已难以满足企业需求。越来越多企业开始选择新型海外专线解决方案&#xff0c;其中基于SD-WAN技术的企业级海外网络专线备受关注。这类服务不仅能保障跨国数据传输&#xff0c;还能根据业务需求灵活调整网络配置。接下来我们…

阿里云服务器安装docker以及mysql数据库

(1) 官方下载路径 官方下载地址: Index of linux/static/stable/x86_64/阿里云镜像地址: https://mirrors.aliyun.com/docker-ce/下载最新的 Docker 二进制文件&#xff1a;wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.23.tgz登录到阿里云服务…

深入解析:HarmonyOS Design设计语言的核心理念

深入解析&#xff1a;HarmonyOS Design设计语言的核心理念 在当今数字化迅速发展的时代&#xff0c;用户对操作系统的体验要求越来越高。华为的HarmonyOS&#xff08;鸿蒙操作系统&#xff09;应运而生&#xff0c;旨在为用户提供全场景、全设备的智慧体验。其背后的设计语言—…

dfs记忆化搜索刷题 + 总结

文章目录 记忆化搜索 vs 动态规划斐波那契数题解代码 不同路径题解代码 最长递增子序列题解代码 猜数字大小II题解代码 矩阵中的最长递增路径题解代码 总结 记忆化搜索 vs 动态规划 1. 记忆化搜索&#xff1a;有完全相同的问题/数据保存起来&#xff0c;带有备忘录的递归 2.记忆…

【Linux】进程的详讲(中上)

目录 &#x1f4d6;1.什么是进程? &#x1f4d6;2.自己写一个进程 &#x1f4d6;3.操作系统与内存的关系 &#x1f4d6;4.PCB(操作系统对进程的管理) &#x1f4d6;5.真正进程的组成 &#x1f4d6;6.形成进程的过程 &#x1f4d6;7、Linux环境下的进程知识 7.1 task_s…

优选算法的巧思之径:模拟专题

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、模拟 二、例题讲解 2.1. 替换所有的问号 2.2. 提莫攻击 2.3. Z字形变换 2.4. 外观数列 2.5. 数青蛙 一、模拟 模拟算法说简单点就是照葫芦画瓢&#xff0c;现在草稿纸上模拟一遍算法过程&#xf…

【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程

【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建&#xff0c;详细详细教程 一、 服务器介绍二、下载 Minecraft 服务端三、安装 JDK 21四、搭建服务器五、本地测试连接六、添加服务&#xff0c;并设置开机自启动 前言&#xff1a; 推荐使用云服务器部署&…

文本分析(非结构化数据挖掘)——特征词选择(基于TF-IDF权值)

TF-IDF是一种用于信息检索和文本挖掘的常用加权算法&#xff0c;用于评估一个词在文档或语料库中的重要程度。它结合了词频&#xff08;TF&#xff09;和逆文档频率&#xff08;IDF&#xff09;两个指标&#xff0c;能够有效过滤掉常见词&#xff08;如“的”、“是”等&#x…

【JavaSE】小练习 —— 图书管理系统

【JavaSE】JavaSE小练习 —— 图书管理系统 一、系统功能二、涉及的知识点三、业务逻辑四、代码实现4.1 book 包4.2 user 包4.3 Main 类4.4 完善管理员菜单和普通用户菜单4.5 接着4.4的管理员菜单和普通用户菜单&#xff0c;进行操作选择&#xff08;1查找图书、2借阅图书.....…

多线程(多线程案例)(续~)

目录 一、单例模式 1. 饿汉模式 2. 懒汉模式 二、阻塞队列 1. 阻塞队列是什么 2. 生产者消费者模型 3. 标准库中的阻塞队列 4. 自实现阻塞队列 三、定时器 1. 定时器是什么 2. 标准库中的定时器 欢迎观看我滴上一篇关于 多线程的博客呀&#xff0c;直达地址&#xf…

一个判断A股交易状态的python脚本

最近在做股票数据相关的项目&#xff0c;需要用到判断某一天某个时刻A股的状态&#xff0c;比如休市&#xff0c;收盘&#xff0c;交易中等&#xff0c;发动脑筋想了一下&#xff0c;这个其实还是比较简单的&#xff0c;这里我把实现方法分享给大家。 思路 当天是否休市 对于某…

闪记(FlashNote):让灵感快速成文的轻量级笔记工具

闪记&#xff08;FlashNote&#xff09;&#xff1a;让灵感快速成文的轻量级笔记工具 你是否经常遇到这样的情况&#xff1a;桌面上放了一大堆的新建123.txt&#xff0c;想记录一个想法&#xff0c;应该是一键开个一个快捷键然后瞬间记录就自动保存了&#xff0c;现在的很多笔记…

《大模型部署》——ollama下载及大模型本地部署(详细快速部署)

ollama Ollama 是一款开源跨平台的大语言模型&#xff08;LLM&#xff09;运行工具&#xff0c;旨在简化本地部署和管理 AI 模型的流程。 下载ollama 进入官网下载https://ollama.com/ 选择需要的系统下载 下载完成后直接进行安装 下载大模型 选择想要部署的模型&#…

Geotools结合SLD实现矢量中文标注下的乱码和可用字体解析

目录 前言 一、需求溯源 1、原始的SLD渲染 2、最初的效果 二、问题修复 1、还是字符编码 2、如何选择可用的字体 3、如何查看支持的字体库 三、总结 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的不断发展&#xff0c;矢量数据的可视化和标注成为了地理信息展…

基于Python与CATIA V5的斐波那契螺旋线自动化建模技术解析

引言 斐波那契螺旋线&#xff08;Fibonacci Spiral&#xff09;作为自然界广泛存在的黄金比例曲线&#xff0c;在工业设计、产品造型、机械工程等领域具有重要应用价值。本文将以Python控制CATIA V5进行参数化建模为例&#xff0c;深入解析三维CAD环境中复杂数学曲线的自动化生…

动态规划(11.按摩师)

题目链接&#xff1a;面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 状态表示&#xff1a; 对于简单的线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b;…

CentOS下安装Docker,Docker下安装JDK\MYSQL\REDIS\NGINX

先用VM安装好Centos8.5&#xff0c;可以选择安装迷你版&#xff0c;我安装的是UI版。 然后用MobaXterm_Portable_v23.0_cn连上去&#xff0c;互访成功就可以往下操作。 1. 修改文件&#xff1a;就是要把之前的mirror替换成现在的vault cd /etc/yum.repos.d/sed -i s/mirrorl…

demo.launch(inbrowser=True, share=True)无法生成共享网址

Gradio 的共享功能无法正常工作&#xff0c;原因是缺少一个名为 frpc_windows_amd64_v0.3 用到代码 app.demo.launch(show_errorTrue, inbrowserTrue, shareTrue) show_errorTrue&#xff1a;这个参数的作用是当应用在启动过程中出现错误时&#xff0c;会显示错误信息。这对于调…

翻译: 人工智能如何让世界变得更美好二

Basic assumptions and framework 基本假设和框架 To make this whole essay more precise and grounded, it’s helpful to specify clearly what we mean by powerful AI (i.e. the threshold at which the 5-10 year clock starts counting), as well as laying out a fram…

【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug

【vue】editor富文本输入全英文&#xff0c;谷歌浏览器&#xff1a;元素不会自动换行bug 解决方案&#xff1a;给元素一个宽度 100% .editor {width: 100%; }