

文章目录
- [1. 【6.2】P12184 [蓝桥杯 2025 省 Python A] 偏蓝](#1. 【6.2】P12184 [蓝桥杯 2025 省 Python A] 偏蓝)
- [2. 【6.3】P12156 [蓝桥杯 2025 省 Java B] 电池分组](#2. 【6.3】P12156 [蓝桥杯 2025 省 Java B] 电池分组)
- [3. 【6.4】P12173 [蓝桥杯 2025 省 Python B] 最多次数](#3. 【6.4】P12173 [蓝桥杯 2025 省 Python B] 最多次数)
- [4. 【6.5】P12171 [蓝桥杯 2025 省 Python B] 最长字符串](#4. 【6.5】P12171 [蓝桥杯 2025 省 Python B] 最长字符串)
- [5.【6.6】P12176 [蓝桥杯 2025 省 Python B] 书架还原](#5.【6.6】P12176 [蓝桥杯 2025 省 Python B] 书架还原)
- [6. 【6.7】P12341 [蓝桥杯 2025 省 A/Python B 第二场] 消消乐](#6. 【6.7】P12341 [蓝桥杯 2025 省 A/Python B 第二场] 消消乐)
- [7. 【6.8】P12188 [蓝桥杯 2025 省 Java A/研究生组] 变换数组](#7. 【6.8】P12188 [蓝桥杯 2025 省 Java A/研究生组] 变换数组)
正文
1. 【6.2】P12184 [蓝桥杯 2025 省 Python A] 偏蓝
【答案】5559680
【AC_Code】
cpp
#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
void solve()
{
int ans = 0;
for (int i = 0; i <= 255; i ++) for (int j = 0; j <= 255; j ++) for (int k = 0; k <= 255; k ++)
{
if (k > i && k > j) ans ++;
}
cout << ans << '\n';
}
int main()
{
IOS int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
2. 【6.3】P12156 [蓝桥杯 2025 省 Java B] 电池分组
【分析】
考察位运算。
① 小蓝需要将这 n 个能量电池分成两组,使得这两组能量电池的能量值异或和相等。
↓
假设可以分成两组(a组和b组)异或和相等 => a组 ^ b组 = sum = 0(自反性)
② 每组至少包含一个能量电池 => n >= 2
以上两个条件即解题的充分必要条件。
【AC_Code】
cpp
#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
void solve()
{
int t; cin >> t;
while (t --)
{
int n; cin >> n; int a, sum = 0;
for (int i = 0; i < n; i ++) cin >> a, sum ^= a;
if (sum == 0 && n >= 2) cout << "YES\n";
else cout << "NO\n";
}
}
int main()
{
IOS int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
3. 【6.4】P12173 [蓝桥杯 2025 省 Python B] 最多次数
【分析】
考察字符串和贪心。
检查函数:判断当前三个字符是否是'l','q','b'的任意排列。
整体思路:遍历字符串,每次检查连续的三个字符是否满足喜欢单词,满足将答案加一,跳过三个字符(避免重叠),不满足跳过当前字符继续判断。
【AC_Code】
cpp
#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
bool check(char a, char b, char c)
{
return
{
(a == 'l' || a == 'q' || a == 'b') &&
(b == 'l' || b == 'q' || b == 'b') &&
(c == 'l' || c == 'q' || c == 'b') &&
(a != b && a != c && b != c)
};
}
void solve()
{
string s; cin >> s; int ans = 0;
for (int i = 0; i < s.length() - 2; )
{
if (check(s[i], s[i + 1], s[i + 2])) ans ++, i += 3;
else i ++;
}
cout << ans << '\n';
}
int main()
{
IOS int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
4. 【6.5】P12171 [蓝桥杯 2025 省 Python B] 最长字符串
【分析】
考察字符串。
【答案】afplcu
【AC_Code】
cpp
#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
void solve()
{
string s, max_s = "";
while (cin >> s)
{
if (max_s.length() < s.length()) max_s = s;
else if (max_s.length() == s.length() && max_s > s) max_s = s;
}
cout << max_s << '\n';
}
int main()
{
IOS int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
5.【6.6】P12176 [蓝桥杯 2025 省 Python B] 书架还原
【分析】
考察贪心 + 并查集。
这道题是说,有一排书编号乱了,我们要把它们摆回正确顺序(编号等于位置),求最少需要交换多少次。
怎么想呢?
举个例子,比如书现在排的是 3 1 2
,正确顺序是 1 2 3
。
我们从左到右看:
- 第1位是3(不对),那正确应该是1,所以看看1现在在哪(在第2位)。
- 把第1位的3和第2位的1交换,变成
1 3 2
,这时候交换了1次。 - 接着看第2位是3(不对),正确应该是2,2现在在第3位。
- 交换第2位和第3位,变成
1 2 3
,又交换1次,总共2次。
代码思路:
- 用数组
a
存当前书的顺序,pos
存每个编号的位置(比如编号3在位置1,pos[3]=1
)。 - 遍历每个位置
i
:- 如果当前书
a[i]
不等于i
(没摆对),就找到编号i
现在的位置pos[i]
。 - 把
a[i]
和a[pos[i]]
交换,同时更新它们的位置(因为交换后,这两个编号的位置变了)。 - 每交换一次,计数器
ans
加1。
- 如果当前书
- 最后输出
ans
就是最少交换次数。
为什么这样能行?
因为每次交换至少能让一个书回到正确位置,剩下的书会形成一个"环"(比如3→1→2→3),每个环里的书需要 环长度-1
次交换,这样遍历一遍就能算完所有交换次数,简单又高效!
【AC_Code】
cpp
#include <iostream>
#include <utility>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const int N = 1e6 + 10; int a[N], pos[N], ans;
void solve()
{
int n; cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i], pos[a[i]] = i;
for (int i = 1; i <= n; i ++)
{
if (a[i] != i) pos[a[i]] = pos[i], swap(a[i], a[pos[i]]), pos[i] = i, ans ++;
}
cout << ans << '\n';
}
int main()
{
IOS int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
6. 【6.7】P12341 [蓝桥杯 2025 省 A/Python B 第二场] 消消乐
【分析】
考察贪心 + 双指针。
用较前面的A匹配较后面的B,用双指针简单模拟一遍即可!
【AC_Code】
cpp
#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
void solve()
{
string s; cin >> s; int l = 0, r = s.size() - 1, ans = s.size();
while (l < r)
{
while (s[l] != 'A' && l < r) l ++;
while (s[r] != 'B' && l < r) r --;
if (l < r) ans -= 2, l ++, r --;
}
cout << ans << '\n';
}
int main()
{
IOS int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
7. 【6.8】P12188 [蓝桥杯 2025 省 Java A/研究生组] 变换数组
【分析】
考察模拟
关键点在于求一个数转为二进制下1的个数,具体见我的代码。
【AC_Code】
cpp
#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const int N = 1e3 + 10; int a[N];
//int cal(int num)
//{
// int cnt = 0;
// while (num) cnt += num & 1, num >>= 1;
// return cnt;
//}
void solve()
{
int n; cin >> n; for (int i = 0; i < n; i ++) cin >> a[i]; int m; cin >> m;
while (m --) for (int i = 0; i < n; i ++) a[i] *= __builtin_popcount(a[i]);
// while (m --) for (int i = 0; i < n; i ++) a[i] *= cal(a[i]);
for (int i = 0; i < n; i ++) cout << a[i] << " \n"[i == n - 1];
}
int main()
{
IOS int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
结语
感谢您的阅读!期待您的一键三连!欢迎指正!
