2026.4.11 蓝桥杯软件类C/C++ G组山东省赛 小记

赛前

省赛不在本校打,而在隔壁的青岛理工大学打,还是很惊喜的,第一次发现省赛也能出去玩。

赛前做了一下去年的省赛题,难度一般,比B组简单一些,还是比较有信心的。

赛时

比赛那天早上七点半就起了床,还处于朦胧的状态就打车去青岛理工大学。

进了考场,突然有了很久不曾出现的紧张的感觉,或许是太久不碰线下赛了,所有人一起敲击键盘的声音让我感受到很大的压力。但在短暂的调整之后我还是适应了节奏。

A(模拟)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
/*
性质1:

---------------------------
性质2:

---------------------------
*/
void solve() {
	cout << "138966";
};

signed main(){
	IOS
	int t = 1;
	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

签到题,答案是138966.

B(?)

想了一会,并不会。赛前VP了25年研究生组省赛真题,也是第二个填空不会,遂放弃。

C(动态规划)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
/*
性质1:

---------------------------
性质2:

---------------------------
*/
void solve() {
	string s;
	cin >> s;
	int n = s.size();
	s = '#' + s;
	vector<int> dp(n + 1);
	for(int i = 1 ; i <= n ; i ++) {
		dp[i] = max(dp[i] , dp[i - 1]);
		if(s[i] == '6') {
			if(i < 4) continue;
			if(s[i - 1] == '2' && s[i - 2] == '0' && s[i - 3] == '2') {
				dp[i] = max(dp[i] , dp[i - 4] + 1);
			}
		}
		if(s[i] == '2') {
			if(i < 6) continue;
			if(s[i - 1] == '0' && s[i - 2] == '2' && s[i - 3] == '2' && s[i - 4] == '0' && s[i - 5] == '2') {
				dp[i] = max(dp[i] , dp[i - 6] + 1);
			}
		}
	}
	cout << dp[n];
};

signed main(){
	IOS
	int t = 1;
//	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

好像贪心就能写完,但是我当时没有证明出贪心的正确性,所以想了一个动态规划的做法,语句的顺序写的有一点小问题,大概会挂1 - 2分。

D(简单计数)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
/*
性质1:

---------------------------
性质2:

---------------------------
*/
void solve() {
	int n;cin >> n;
	vector<int> arr(n + 1);
	for(int i = 1 ; i <= n ; i ++) cin >> arr[i];
	map<int , int> cnt;
	int ans = 0;
	for(int i = 1 ; i <= n ; i ++) {
		int x = - arr[i];
		ans += cnt[x];
		x = - (arr[i] - 1);
		ans += cnt[x];
		cnt[arr[i]] ++;
	}
	cout << ans ;
};

signed main(){
	IOS
	int t = 1;
//	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

记一下数即可,也是送分题

E(差分数组)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
/*
性质1:

---------------------------
性质2:

---------------------------
*/
void solve() {
	int n;cin >> n;
	vector<int> c(n + 2);
	for(int i = 1 ; i <= n ; i ++) {
		int l , r;
		cin >> l >> r;
		c[l] += 1;
		c[r + 1] -= 1;
	}
	for(int i = 1 ; i <= n ; i ++) {
		c[i] += c[i - 1];
	}
	int ans = -1;
	for(int i = n ; i >= 0 ; i --) {
		if(c[i] == i) {
			ans = i;
			break;
		}
	}
	cout << ans ;
};

signed main(){
	IOS
	int t = 1;
//	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

差分数组模版题,注意差分数组不要开小了导致越界即可。

F(博弈)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
/*
性质1:

---------------------------
性质2:

---------------------------
*/
void solve() {
	int n;cin >> n;
	vector<int> arr(n + 1);
	for(int i = 1 ; i <= n ; i ++) cin >> arr[i];
	//L赢不赢
	auto dfs = [&](auto &&self , int x) -> bool {
		if(x == 0) return 0;
		if(x == 1) return 1;
		if(arr[x] == 1) {
			if(arr[x - 1] != 1) {
				return 0;
			} else {
				return self(self , x - 2);
			}
		} else {
			return 1;
		}
	};
	int win = dfs(dfs , n);
	if(win == 1) {
		cout << "L\n";
	} else {
		cout << "Q\n";
	}
};

signed main(){
	IOS
	int t = 1;
	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

场上打了个表,找到了一点规律,可以线性的做完。

G(?)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
/*
性质1:

---------------------------
性质2:

---------------------------
*/
void solve() {
	int n;cin >> n;
	vector<int> arr(n + 1) , pre(n + 1);
	for(int i = 1 ; i <= n ; i ++) {
		cin >> arr[i];
		pre[i] = pre[i - 1] + arr[i];
	}
	int ans = 0;
	for(int i = 1 ; i <= n - 2 ; i ++) {
		for(int j = i + 1 ; j <= n - 2 ; j ++) {
			for(int k = j + 1 ; k <= n - 1 ; k ++) {
				int sum1 = abs(pre[i] - pre[0]);
				int sum2 = abs(pre[j] - pre[i]);
				int sum3 = abs(pre[k] - pre[j]);
				int sum4 = abs(pre[n] - pre[k]);
				ans = max(ans , sum1 + sum2 + sum3 + sum4);
			}
		}
	}
	cout << ans ;
};

signed main(){
	IOS
	int t = 1;
//	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

60%还是很好想的,想了一会100%,完全想不出来,摸了暴力就跑路了。

H(?)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int INF = 1e18;
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
/*
性质1:

---------------------------
性质2:

---------------------------
*/

struct DSU {
	vector<int> fa , siz;
	
	DSU() {}
	DSU(int n) {
		init(n);
	}
	
	void init(int n) {
		fa.resize(n);
		iota(fa.begin(), fa.end(), 0);
		siz.assign(n, 1);
	}
	
	int find(int x) {
		while (x != fa[x]) {
			x = fa[x] = fa[fa[x]];
		}
		return x;
	}
	
	bool same(int x, int y) {
		return find(x) == find(y);
	}
	
	bool merge(int x, int y) {
		x = find(x);
		y = find(y);
		if (x == y) {
			return false;
		}
		siz[x] += siz[y];
		fa[y] = x;
		return true;
	}
	
	int size(int x) {
		return siz[find(x)];
	}
};

void solve() {
	int n , m;
	cin >> n >> m;
	DSU dsu(n + 1);
	for(int i = 1 ; i <= m ; i ++) {
		int u , v , w;
		cin >> u >> v >> w;
		dsu.merge(u , v);
	}
	vector<int> ans(10);
	for(int i = 1 ; i <= n ; i ++) {
		if(dsu.find(i) == i) {
			int cnt = dsu.siz[i];
			ans[0] += cnt * (cnt - 1);
		}
	}
	for(int i = 0 ; i < 10 ; i ++) {
		cout << ans[i] << "\n";
	}
};

signed main(){
	IOS
	int t = 1;
//	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

30%还是很好想的,写完30%的时候还剩半小时,因为有点急事所以就提前离场了,没有走的话或许可以尝试一下50%和70%。

赛后

去洛谷自测了一下下,上面的代码就是根据我赛时的记忆复现的。

题号 A B C D E F G H 总计
场上估分 5 0 10 10 15 15 12 6 73
洛谷自测 5 0 9 10 15 15 12 6 72

总结一下,青岛理工大学真的是超级棒!

首先就是景色很美呀,青岛的四月,五颜六色的🌸都开了,看着赏心悦目的。

其次就是志愿者小哥哥小姐姐们真的很热心,也很有耐心。

更重要的是这里的机房真的很无敌,键盘回弹速度很快,一点不输我自己的机械键盘,电脑编译运行时间也很快,完全不是老年机,让我的效率大大提升,体验感拉满。

然后说一下题目,研究生组打的人明显就很少很少,研究生组的初赛题目和AB组比起来也是偏简单,如果全力发挥能拿到80分左右的分数,这在AB组还是很困难的。今年貌似反作弊机制加强了,再一次希望🏀杯蒸蒸日上。

相关推荐
2401_892070982 小时前
链栈(链式栈) 超详细实现(C 语言 + 逐行精讲)
c语言·数据结构·链栈
minji...3 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
CoderCodingNo5 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
cmpxr_6 小时前
【C】局部变量和全局变量及同名情况
c语言·开发语言
hetao17338376 小时前
2026-04-09~12 hetao1733837 的刷题记录
c++·算法
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 136. 只出现一次的数字 | C++ 哈希表&异或基础解法
c++·算法·leetcode
汉克老师7 小时前
GESP2024年6月认证C++三级( 第二部分判断题(1-10))
c++·数组·位运算·补码·gesp三级·gesp3级
无限进步_8 小时前
【C++】只出现一次的数字 II:位运算的三种解法深度解析
数据结构·c++·ide·windows·git·算法·leetcode
网域小星球8 小时前
C 语言从 0 入门(十七)|结构体指针 + 动态内存 + 文件综合实战
c语言·开发语言·文件操作·结构体指针·动态内存·综合项目