2026年第17届蓝桥杯省赛整体难度中等,风格重基础、代码重细节,出现了几个常考考点:前缀和、图论、并查集、动态规划、贪心和二分

一、解题思路与题目分析

1. 分析

从暴力超时到AC Accepted,从思路卡顿到秒破题型。
这篇文章,我将毫无保留的分享备赛经历,和对本次蓝桥杯真题进行逐题分析,从题意分析、算法选型、代码实现、易错和优化四个维度,完整写出AC代码!

2. 试题

2.1. 试题A:青春常数

在这里插入图片描述
这道考题的知识点就是取上整,如果算出来不对,可能是没开long long 的原因,如果不能一下子找到规律,最好的做法就是举例子,比如 n=3 的时候有多少种情况?但是不要忘记 x 为 0 的那一个可能。

代码:

#include<iostream>
using namespace std;
int main()
{
    long long N=2026202520242023;
    cout<<(N+1)/2;
    return 0;
}

2.2. 试题B:双碳战略

在这里插入图片描述
分析:这道题靠的知识点是数学归纳法+快速幂,每个灯只有亮和不亮两种情况,假设为 0 或 1 ,每次翻转 0 变 1 ,1 变 0 。
操作规则:
奇数次操作:选位置 i,将 [i, 2026] 的路灯翻转。
偶数次操作:选位置 i,将 [1, i] 的路灯翻转。
设 0 和 1 之间有一个隔板,想要到任一状态,操作次数就是隔板的数量,同一状态可能完全相反,还需额外再进行一次整体颜色调整,比如 10101 和 01010 ,想要达到这个状态,就要有 4+4+1 次操作,所以每个状态就是 2n+1。最后要计算的就是2026*2^(2026-1)。

#include <iostream>
using namespace std;

const int MOD = 998244353;

long long qpow(long long a, long long b) {
    long long res = 1;
    while (b > 0) {
        if (b & 1) res = res * a % MOD;
        a = a * a % MOD;
        b >>= 1;//快速幂
    }
    return res;
}

int main() {
    long long n = 2026;
    long long ans = n * qpow(2, n - 1) % MOD;
    cout << ans << endl;
    return 0;
}

2.3. 试题C:循环右移

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

分析:这道题考的是思维,最重要的是要理解循环右移的规律,想要循环右移后的子数组跟右移前一样,只能是元素都相同的子数组。X 到 Y 之间有 Y-X+1 个数。

代码:

#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
    LL T; cin>>T;
    LL N,X,Y;
    while(T--)
    {
        cin>>N>>X>>Y;
        if(X>Y) cout<<"0"<<endl;
        else cout<<Y-X+1<<endl;
    }
    return 0;
    
}

2.4. 试题D:蓝桥竞技

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

分析:这道题考的也是思维,想要把所有选手都按照规则分完,要满足两个条件:一是总人数要是5的倍数;二是单个位置选手数不能超过位置总数。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
	LL T;cin>>T;
	while(T--)
	{
		LL max_s=0;
		LL sum=0;
		LL N;cin>>N;
		while(N--)
		{
			LL x;cin>>x;
			max_s=max(max_s,x);
			sum+=x;
		}
		if(sum%5!=0) {
			cout<<"F"<<endl;
		}
		else{
			if(max_s<=sum/5) cout<<"T"<<endl;
		    else cout<<"F"<<endl;
		}
	 } 
	 return 0;
 } 

2.5. 试题E:LQ聚合

在这里插入图片描述
在这里插入图片描述
分析:这道题主要考的知识点是贪心算法前缀和
我自己在做这道题的时候有一个疑点,就是所有L的位置是不是严格小于Q的,其实不是,题目的意思是计算的时候 1 <= i < j <= N ,至于不不满足的,不计算进去就行。
为了让结果最大,可以得出: ? 变的 L 一点全在 ?变的 Q 前面。
对于每个Q,看它左边有多少个 L,把这些数加起来,因此,为了答案尽可能大,五年希望 L 尽可能靠左,Q 尽可能靠右。

代码:

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

int main()
{
	
	int n;
	string s;
	cin>>n>>s;
	LL cur=0;
	LL ans=0;
	
	//初始把所有 ? 当成 Q
	LL cntL=0;
	for(char c:s){
		if(c=='L'){
			cntL++;
		}
		else{
			cur+=cntL;//Q 或 ? 都当成了 Q 
		}
	} 
	ans=cur;
	//预处理有多少个非 L字符 
	vector<int> suf(n+1,0);
	for(int i=n-1;i>=0;i--){
		suf[i]=suf[i+1]+(s[i]!='L');
	}
	cntL=0;
	for(int i=0;i<n;i++){
		if(s[i]=='L'){
			cntL++;
		}
		else if(s[i]=='?'){
			//原来作为Q时,和左边 cntL 个L配对
			cur-=cntL;
			//原来改成L后,和右边所有仍视为 Q 的字符配对 
			cur+=suf[i+1];
			
			cntL++; 
			ans=max(ans,cur);
		}
	}
	cout<<ans<<endl;
	return 0;
 }

2.6. 试题G:理想温度

在这里插入图片描述
在这里插入图片描述
分析:这道题考的知识点是动态规划(前缀和+哈希表),可以设置一个 c数组,存 a b 的差,但是注意可能会有负数,所以不能用 c数组的值作下标。
固定一个数k。k最多有n个值。
有些数字可能原本就符合要求(a-b等于0),但是操作过后就不符合要求了。
可以把是0的数看成-1,等于k的数看成1,其他的数看成0。(等价替换的思想)。转化为求他们的最大子数组

代码:

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

int main()
{
	int n;
	cin>>n;
	vector<int>d(n);
	for(int i=0;i<n;++i) cin>>d[i];
	for(int i=0;i<n;++i){
		int k;
		cin>>k;
		d[i]=k-d[i];
	}
	int z=0;//前缀0的数量 
	int ans=0;
	map<int,int>mn,cnt;
	
	for(int i=0;i<n;++i){
		int k=d[i];
		if(k==0){
			z++;
		}
		else{
			int cur=cnt[k]-z;
			if(!mn.count(k))  mn[k]=cur;
			else mn[k]=min(mn[k],cur);
			
			cnt[k]++;
			ans=max(ans,cnt[k]-z-mn[k]);
		}
	}
	cout<<z+ans<<endl;
	return 0;
 } 

只出了部分题目,还有两道题我暂时还没有学会涉及的知识点,还无法看懂题解,后面有机会会更新。

二、感受与心得

1. 前言:一次勇敢的尝试

2.1. 心路历程

作为一名刚学完C语言基础的大一学生,我凭着一股“我可以自学”的冲劲报名了17届蓝桥杯。那时的我,对编程竞赛还没有清晰的概念,只觉得敢报名、敢尝试,就是一种胜利。原以为我是熟练C语言的高手,到寒假真正备赛的时候才发现我是一个零基础起步的初学者,让我不禁怀疑:我真的适合站在这里吗?

为什么这么想呢?上学期学了C语言程序设计,课程和作业的难度是令我得心应手的。当我知道C/C++程序设计这个赛道只用会其中之一就能写代码后,立马就报了,还想着现在不报,后面都学其他语言了也会忘记。转折来了。真正开始准备后,我才明白,比赛远比想象中要更难。前缀和、贪心算法、高精度、DP、搜索……这些曾经连名字都没听过的知识,像一座小山挡在前面。

但是我没有就此放弃,尽力补上所有知识点,但还有一个多月时,我意识到好像来不及了,我放弃深耕知识点,选择从题目中寻找我应该学什么,但是慢慢的发现用C语言做算法题好像很困难,也刷到有老师说最好要用C++写,用C语言写与用C++比较,好比别人开火箭我却还在用脚。

2.2. 备赛过程

我一边学习数据结构,一边学习C++程序设计课程,直到我能看懂题目,能看懂题解,最后能独自写出代码,我才真正的踏入算法竞赛的道路。此时距离比赛还有两个星期。我开始分模块的学习各种算法,模拟入门、普通枚举、高精度运算、前缀和……,再到更有难度的双指针、滑动窗口、二分查找等。到了还有一个星期的时候,开始研究真题,攻克没学过的知识。虽然时常不能AC,为了提高代码效率,反复研究如何用更优的语法,还和经常AI深度交流,互相指教,但是求解的过程并不枯燥。蓝桥杯所包含的知识太多,我知道我还有好多都没学到,比如并查集、图论、树等等。但是能勉强做对一半的题,这让我对这场本以为没有胜算的竞赛更有信心了。

2.总结

此次竞赛是一次宝贵的学习与历练,虽然没有做好充分的准备就上场了,但是让我收获了很多,我将总结本次经验教训,把备赛、参赛过程中收获的学习方法、心态感悟运用到今后的学习中,持续提升自我,在专业的道路上不断前行。
也以我的经历告诉大一的同学们,多去尝试与历练。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐