Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【蓝桥杯】第十四届C++B组省赛

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

作者头像
_小羊_
发布于 2025-04-01 00:52:34
发布于 2025-04-01 00:52:34
8500
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行

试题A:日期统计

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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) 不能去等号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 要取较大值。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 表示当前数的开头。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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:岛屿个数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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的区间内不累加到结果中就行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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:整数删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 样例输入
5 3
1 4 2 8 7
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 样例输出
17 7

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
} 

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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:景区导游

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 样例输入
6 4
1 2 1
1 3 1
3 4 2
3 5 2
4 6 3
2 6 5 1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 样例输出
10 7 13 14
代码语言:javascript
代码运行次数:0
运行
复制

试题J:砍树

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 样例输入
6 2
1 2
2 3
4 3
2 5
6 5
3 6
4 5
4
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 样例输出
4

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【蓝桥杯】第十三届C++B组省赛
根据我们对日期的了解,要有顺子出现则只可能有 012、123 这两种,而且年份2022也不用考虑,所以我们可以遍历2022年每一天的日期然后删选统计。
_小羊_
2025/03/17
630
【蓝桥杯】第十三届C++B组省赛
第十四届省赛大学B组(C/C++)飞机降落
其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti+Di 时刻开始降落。
摆烂小白敲代码
2024/09/23
760
蓝桥杯练习题总结(二)dfs题、飞机降落、全球变暖
个单位时间。 输入格式: 输入包含多组数据。 第一行包含一个整数N,代表测试数据的组数。 对于每组数据: 第一行包含一个整数T,代表测试数据的组数。 对于每组数据,第一行包含一个整数 N。 接下来的N行,每行包含三个整数
走在努力路上的自己
2024/03/22
2560
蓝桥杯练习题总结(二)dfs题、飞机降落、全球变暖
2019 年第十届蓝桥杯省赛 B组 C++超详细题解
B 2.年号字串 思路:明显是个26进制好吧 那么 2019 = 2*26^2 + 25 * 26 + 17
杨鹏伟
2020/10/26
4850
【刷题】备战蓝桥杯 — dfs 算法
在蓝桥杯的比赛中,深度优先搜索(DFS,Depth-First Search)算法是一种常用的搜索算法,它通过尽可能深地搜索树的分支,来寻找解决方案。由于其简单和易于实现的特性,DFS成为解决问题的强大工具,尤其是在数据规模较小的情况下。数据在100以内一般使用dfs
叫我龙翔
2024/04/12
3150
【刷题】备战蓝桥杯 — dfs 算法
湖南大学程序设计竞赛新生赛(重现赛)
题目链接—点我开启传送门哦! A.题意:就是求任意两个斐波那契数列的最大公约数!
杨鹏伟
2020/09/11
5340
湖南大学程序设计竞赛新生赛(重现赛)
【算法】前缀和、模拟、位运算、差分
先把所有的数加起来,在这个过程之中把偶数放到堆中,在遍历这个全是偶数的堆k次,每次让所有数之和减去最大偶数的一半,如果最大偶数除2后还是偶数还要重新添加到堆中,在这个过程中还要关注堆是否已经空了。
_小羊_
2025/03/15
440
【算法】前缀和、模拟、位运算、差分
牛客小白月赛22 A~~J
A.链接:https://ac.nowcoder.com/acm/contest/4462/A 来源:牛客网
杨鹏伟
2020/09/11
3920
18级个人训练赛--2
B --Consecutive Integers AtCoder 5037 思路:水题,签到~
杨鹏伟
2020/09/11
3150
【算法】前缀和问题
本题中的 dp[i] 表示的是 i 位置之前的前缀和,不包括 i 位置,所以 dp 表要多开一个位置,而且还要注意循环的区间。
_小羊_
2025/03/29
1030
【算法】前缀和问题
第三届传智杯全国大学生IT技能大赛(决赛)B组--详细题解
思路:我以为是博弈论呢,吓我一跳,就先去看E题了。最后交了几发随机函数。(我看成了打出比上个人大的牌,竟然还有限制条件!!!能打过的–最小的牌!!!)
杨鹏伟
2021/04/25
8310
第三届传智杯全国大学生IT技能大赛(决赛)B组--详细题解
HPU 18级个人积分赛--first
J. Worker 思路:我们仔细分析一下题意,给了n个厂,m个人,假设每个厂的福利原因使得工人的工作能力不同,然后你要把这m个人分给n个厂,使得每个厂的总效益相同。给厂分人,肯定是福利不好效益低的厂多分几个人,然后效益高的人少。如何实现这个决策呢?***求最小公倍数!!!***所有厂效益的最小公倍数,然后用这个最小公倍数挨个求得是每个厂效益的多少倍并累加。如果工人数对这个倍数取余 == 0;则说明可以实现这样的一种分配!
杨鹏伟
2020/09/11
3250
HPU 18级个人积分赛--first
天梯赛题库
L1-009 N个数求和 (20分) 思路:分母相乘,分子先相乘在相加,然后约分。
杨鹏伟
2020/11/12
8590
HPU personal-training 2
A - Kefa and Park 题意:就是一棵树,然后本人的家在根上,餐厅在叶子节点上。然后在前往叶子结点的餐厅的时候,途中的结点上有猫,而这个人特别怕毛,如果猫超过M只,那么他就不会走这条路!最终要你输出他能去餐厅的数量,也就是多少条路!
杨鹏伟
2020/09/11
3050
【今日三题】压缩字符串(模拟) / chika和蜜柑(topK) / 01背包
_小羊_
2025/04/13
710
【今日三题】压缩字符串(模拟) / chika和蜜柑(topK) / 01背包
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除,并把与它相邻的整数加上被删除的数值。
摆烂小白敲代码
2024/09/23
1190
河南理工大学新生挑战赛
B.The flower 题意:意思就是给一个字符串,然后从字符串中得到子串,并且子串满足情况 1.出现次数大于2,; 2.子串的长度等于k; 找到有多少个这样的串然后按照字典序打印出来
杨鹏伟
2020/09/11
3910
AtCoder Beginner Contest 261 (A·B·C·D)
给定两个染色区间的端点L_1,R_1,L_2,R_2,求同时染上两种颜色的区间长度
浪漫主义狗
2022/09/16
2520
【模拟】蛇形矩阵 / z字形变换 / 数青蛙 / 牛牛冲钻五
先把所有的数加起来,在这个过程之中把偶数放到堆中,在遍历这个全是偶数的堆k次,每次让所有数之和减去最大偶数的一半,如果最大偶数除2后还是偶数还要重新添加到堆中,在这个过程中还要关注堆是否已经空了。
_小羊_
2025/04/09
580
【模拟】蛇形矩阵 / z字形变换 / 数青蛙 / 牛牛冲钻五
河工院首届工业设计大赛程序组(选拔赛)题解
本题为简单的01背包,不过是需要算一下超重多少,但是最多超重100%,那么代码就如下。
浪漫主义狗
2024/04/28
1020
相关推荐
【蓝桥杯】第十三届C++B组省赛
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验