赛前模拟赛, 题目比较简单, 分享一下的解题思路
1. 胜利终将属于你
问题描述
蓝桥杯软件类赛项即将在 2025 年 4 月 12 日上午 9:00 至下午 13:00 正式开赛!这不仅是一场比赛,更是你展现能力的机会,是你努力与坚持的试金石。每一次练习,都是你成长的见证;每一份付出,都是你成功的铺垫。无论面对多大的困难,只要你保持信念、迎难而上,胜利终将属于你!
现在,请你输出
I will fight and win
,用这句话激励自己,坚定前行的步伐!输入格式
无。
输出格式
输出一个字符串,表示答案。
签到题:
#include <iostream>
using namespace std;
int main()
{
cout<<"I will fight and win"<<endl;
return 0;
}
2. 团队赛
问题描述
蓝桥杯最近推出了一项团队赛模式,要求三人组队参赛,并规定其中一人必须担任队长。队长的资格很简单:其程序设计能力值必须严格大于其他两名队友程序设计能力值的总和。
小蓝、小桥和小杯正在考虑报名参加此次比赛。小蓝的程序设计能力值为a,小桥为 b,小杯为 c。
他们想知道能否成功报名。如果可以成功报名,则输出队长的人选:如果小蓝是队长,则输出
l
;如果小桥是队长,则输出q
;如果小杯是队长,则输出b
。如果无法成功参赛,则输出 −1。
输入说明
输入三个整数 a,b,c(1≤a,b,c≤106),分别代表小蓝、小桥和小杯的能力值。
输出格式
若可以参赛,则输出队长对应字符表示,否则输出 −1 表示无法参赛。
代码思路:要求三人中有一人的能力值严格大于其他两人的和, 就代表报名成功, 否则输出-1
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
if (a > b + c) {
cout << 'l' << endl;
} else if (b > a + c) {
cout << 'q' << endl;
} else if (c > a + b) {
cout << 'b' << endl;
} else {
cout << -1 << endl;
}
return 0;
}
3. 蓝桥速算
问题描述
蓝桥杯大赛最近新增了一项娱乐比赛——口算大赛,目的是测试选手的口算能力。
比赛规则如下:
初始给定一个长度为 N 的数组 A,其中第 i 个数字为 Ai。
随后数组会被隐藏,并进行 Q 次值域变换操作。
每次操作给出两个数字 L,R (1≤L≤R≤N),表示对子数组[L,R] 进行如下变换:
AL 增加 L。
AL+1 减少 L+1。
AL+2 增加 L+2。
AL+3 减少 L+3。
以此类推,直到 R。
在所有操作完成后,选手需要快速计算出最终的数组之和,最快回答出正确答案的选手将会获得奖励,请你尝试解决这个问题。
输入格式
第一行输入两个整数 N,Q(1≤N,Q≤105) 表示数组长度和值域变换操作次数。
第二行输入 N 个整数A1,A2,A3,⋯,AN(1≤Ai≤105) 表示数组的初始值。
接下来 Q 行,每行两个整数 L,R(1≤L≤R≤N) 表示一次值域变换操作。
输出格式
输出一个整数,表示值域变换操作完毕后数组之和。
代码思路: 找规律, 按区间长度是奇数/偶数,进行情况
[l,r]
m=r-l
m%2==0
-/+/-/+
[l]-([l]+1)+([l]+2)-...-(r-1)+r
[l]+(1+...+1)
[l]+m/2[l,r]
m=r-l
m%2==1
{[l]+[-([l]+1)+([l]+2)-....-r+(r+1)]}-r-1
=[l]+(1+1+...+1)-r-l
=[l]+(m+1)/2-r-1
=[l]+(m+1)/2-m-[l]-1
=[l]-[l]-(m+1)/2
=-(m+1)/2
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
long long sum_initial = 0;
for (int i = 0; i < n; ++i) {
int a;
cin >> a;
sum_initial += a;
}
while (q--) {
int l, r;
cin >> l >> r;
int m = r - l;
if (m % 2 == 0) {
sum_initial += (l + r) / 2;
} else {
sum_initial -= (m + 1) / 2;
}
}
cout << sum_initial << '\n';
return 0;
}
4. 浓缩咖啡液
问题描述
蓝桥杯备赛选手小蓝最近刷题刷到犯困,决定靠咖啡续命。他手上有 N 种浓缩咖啡液,浓度分别是 A1%,A2%,⋯⋯,AN%,每种存货都是无限的。为了提神又不炸脑,小蓝需要按比例混合这些浓缩咖啡液,调出一杯浓度为 M% 的咖啡。
举个例子,假设 M=60,N=2,A1=50,A2=70,那么他可以混合 100毫升的 A1和 100 毫升的 A2,得到 200 毫升、浓度为 (50% ×100+70% ×100)/200=60% 的咖啡。
现在,请你帮小蓝判断,他能不能用这 N 种浓缩咖啡液,调出一杯浓度为 M% 的咖啡?
输入格式
第一行包含一个整数 T(1≤T≤10^3),表示测试数据的组数。
接下来的每组数据包含两行:
- 第一行包含两个整数 N 和 M(1≤N,M≤100),分别表示浓缩咖啡液的种类数和目标浓度。
- 第二行包含 N 个整数 A1,A2,…,AN(1≤Ai≤100),表示每种浓缩咖啡液的浓度。
输出格式
对于每组测试数据,输出一行,如果可以调出浓度为 M% 的咖啡,输出
YES
,否则输出NO
。
代码思路: 两种浓度的咖啡液分别为a, b; 按一定体积进行混合, 可以实现[a,b]范围内的任一浓度, (ax+by)/(x+y)=M, 解出x:y, 所以选一个>M,一个<M, 或者其中有一个本身就等于M也满足题意
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int N, M;
cin >> N >> M;
vector<int> A(N);
bool eq = false;
bool low = false;
bool high = false;
for (int i = 0; i < N; ++i) {
cin >> A[i];
if (A[i] == M) eq = true;
if (A[i] < M) low = true;
if (A[i] > M) high = true;
}
if (eq || (low && high)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
5. 破译密码
问题描述
在近期举办的蓝桥杯竞赛中,诞生了一场激动人心的双人破译挑战。比赛的主办方准备了 N 块神秘的密码芯片,参赛队伍需要在这场智力竞赛中展示团队合作的默契与效率。每个队伍需选出一位破译者与一位传输者,破译者的任务是解锁芯片中隐藏的密码,而传输者则负责将解密后的密码准确无误地发送至主办方的电脑。
在这场比赛中,小蓝与小桥组队参赛,经过深入的讨论与协商,小蓝被任命为破译者,专注于解密每一块密码芯片;而小桥则担任传输者,确保每一份信息能够迅速且顺畅地传递给裁判。比赛开始后,他们迅速评估了破译与传输每一块密码芯片所需的时间:小蓝破译第 i 块芯片需要 Ai 时间,而小桥则需要 Bi 时间来传输第 i 块芯片。
此时,小蓝和小桥迫切想要计算出,在最佳的策略下,完成所有密码芯片破译与传输所需的最短时间,请你帮帮他们。
注意:只有一块芯片完成破译后才能开始传输。
输入格式
第一行输入一个整数 N(1≤N≤1000) 表示芯片数量。
第二行输入 N 个整数 A1,A2,A3,⋯,AN(1≤Ai≤103) 表示小蓝破译每块芯片的时间。
第三行输入 N 个整数 B1,B2,B3,⋯,BN(1≤Bi≤103) 表示小桥传输每块芯片密码的时间。
输出格式
输出一个整数表示答案。
代码思路: 1. 优先处理短解码时间的芯片 2. 推迟处理短传输时间的芯片
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
vector<pair<int, int>> ch(N);
for (int i = 0; i < N; ++i) cin >> ch[i].first;
for (int i = 0; i < N; ++i) cin >> ch[i].second;
sort(ch.begin(), ch.end(), [](const pair<int,int>& x, const pair<int,int>& y) {
if (min(x.first, x.second) != min(y.first, y.second))
return min(x.first, x.second) < min(y.first, y.second);
return x.first < y.first;
});
vector<pair<int, int>> front, back;
for (auto x : ch) {
if (x.first <=x.second)
front.push_back(x);
else
back.push_back(x);
}
sort(back.begin(), back.end(), [](const pair<int,int>& x, const pair<int,int>& y) {
return x.second > y.second;
});
vector<pair<int, int>> sche;
sche.insert(sche.end(), front.begin(), front.end());
sche.insert(sche.end(), back.begin(), back.end());
int dT = 0, tT = 0;
for (auto [a, b] : sche) {
dT += a;
tT = max(tT, dT) + b;
}
cout << tT << endl;
return 0;
}
6. 插入数字
问题描述
在备战蓝桥杯的过程中,小蓝对数字变换的技巧产生了浓厚的兴趣。这天,他想到一个有趣的问题:
给定一个正整数 N,如果在 N 的开头、结尾,或者任意两个相邻数字之间插入一个数字(0∼9),可以得到多少种不同的新数字?需要注意的是,为了保证数字的有效性,插入后的数字不能以 0 开头。
例如,当 N=23 时,可以进行以下操作:
- 在开头插入 1,得到 123;
- 在结尾插入 5,得到 235;
- 在数字 2 和 3 之间插入 7,得到 273。
这些操作会产生不同的数字,但某些插入方式可能会导致重复结果(例如,在 23 的开头插入 2 和在 2 和 3 之间插入 2 都会得到 223)。现在,请你帮助小蓝编写一个程序,在给定 N 的情况下,计算出通过上述插入操作能得到的不同数字的种类数。
输入格式
输入包含一个正整数 N(1≤N≤10^18),即给定的正整数。
输出格式
输出一个整数,表示通过插入操作能得到的不同数字的种类数。
代码思路: substr的第一个参数是起始下标, 第二个参数是长度, 所以直接把d='0'-'9'加入到当前数字的前/中/后, 同时维护一个set.
#include <bits/stdc++.h>
using namespace std;
int main() {
string N;
cin >> N;
int len = N.length();
set<string> res;
for (int i = 0; i <= len; ++i) {
for (char d = '0'; d <= '9'; ++d) {
string newNum = N.substr(0, i) + d + N.substr(i);
if (newNum[0] == '0') continue;
res.insert(newNum);
}
}
cout << res.size() << endl;
return 0;
}
有疑问可以发到评论区, 感谢!