官方题解 | 欢乐赛#74题解
2026-06-03 11:23:30
发布于:浙江
官方题解 | 欢乐赛#74题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的灯牌 | 入门 |
| T2 | 皓仔的幸运数字 | 入门 |
| T3 | 皓仔的字符串分割 | 入门 |
| T4 | 皓仔的藏宝地图 | 入门 |
| T5 | 皓仔的移动距离 | 普及- |
| T6 | 皓仔的好数统计 | 普及- |
T1 皓仔的灯牌
题目大意
根据样例内容使用 * 号在屏幕上画出一个醒目的大写字母 X。
题解思路
定义三个变量 , 用以表示月份,日期还有温度。
输出语句练习题,本题中的图案一共有 行, 直接逐行输出对应的内容构成一个完整的大 X 即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
cout << "* *" << endl;
cout << " * * " << endl;
cout << " * * " << endl;
cout << " * " << endl;
cout << " * * " << endl;
cout << " * * " << endl;
cout << "* *" << endl;
}
T2 皓仔的幸运数字
题目大意
一个数字如果同时满足下面两个条件,就可以被称为“幸运数字”:
- 这个数字在 到 之间,包括 和
- 这个数字是奇数
现在给定三个整数 ,请你判断 是否是皓仔的幸运数字。
如果是,输出 Yes;否则输出 No。
题解思路
如果是幸运数组,则需要同时满足在 到 之间并且是奇数。那么可以拆解成同时满足以下三点:
-
-
-
注意此处不能写 , 因为本题输入纯在负数奇数, 负数的取余结果也为负数,因此负奇数对 取余数之后的结果为 。
三个条件需要同时满足,因此本题中成为幸运数字的条件为 n >= a && n <= b && n % 2 != 0, 条件为真输出 Yes, 否则输出 No 。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, a, b;
cin >> n >> a >> b;
if(n >= a && n <= b && n % 2) cout <<"Yes";
else cout << "No";
return 0;
}
T3 皓仔的字符串分割
题目大意
给定一个字符串,要求先删除所有不是字母的字符,然后:
接着,皓仔会按照保留下来的字母位置进行分割:
- 先输出所有奇数位置上的字母;
- 再输出所有偶数位置上的字母。
这里的位置从 开始编号。
题解思路
读入字符串 , 首先需要将所有的字母字符全部都提取出来。可以定义一个空串 , 并且遍历整个字符串 , 将所有字母字符存入字符串 中。 本题中可能同时存在大写字母和小写字母, 因此判断当前字符 为字母的条件为 s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <='Z'。
最后先输出所有奇数位的字符, 再输出所有偶数位的字符。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string s, t;
cin >> s;
for(int i = 0; i < s.size(); i++) {
if(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <='Z') t += s[i];
}
for(int i = 0; i < t.size(); i += 2) cout << t[i];
for(int i = 1; i < t.size(); i += 2) cout << t[i];
return 0;
}
T4 皓仔的藏宝地图
题目大意
给定一个 的方格,每个格子中都有一个字符。字符可能是大写英文字母,也可能是数字字符。
地图上的每一种大写字母都代表一种宝物,不同字母对应的宝物分值不同。数字字符只是普通标记,没有任何分值。
现在给出 个整数,分别表示字母 A 到 Z 的分值。
请你计算整张地图中所有字母对应分值的总和。
题解思路
本题首先使用一个字符数组存下来完整的地图,而后输入每一个大写字母对应的分值,存储在数组 中,对应下标从 到 。
对于一个大写字母变量 来说,从字符变量到数字 的转化可以直接写 c - 'A' + 1。
最后遍历整个二维数组,每当遍历到一个大写字母时候, 让总答案 加上当前字母的分值,最后输出即可,需要注意答案需要使用 。
参考代码
#include<bits/stdc++.h>
using namespace std;
char a[110][110];
int n, v[110];
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i] + 1;
for(int i = 1; i <= 26; i++) {
cin >> v[i];
}
long long ans = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(a[i][j] >= 'A' && a[i][j] <= 'Z') ans += v[a[i][j] - 'A' + 1];
}
}
cout << ans;
return 0;
}
T5 皓仔的移动距离
题目大意
皓仔站在一个 的方形地图上。
地图的左上角坐标为 ,右下角坐标为 。皓仔一开始站在 。
接下来皓仔会进行 次移动。每次移动会给出 个整数 ,分别表示:
- 向上移动 格
- 向下移动 格
- 向左移动 格
- 向右移动 格
如果这次移动后的落点仍然在地图范围内,那么这次移动有效,皓仔会移动到新的位置。
如果这次移动后的落点在地图外,那么这次移动取消,皓仔的位置保持不变。
请你计算所有有效移动里,每次移动出发点到终点的直线距离的总和。
题解思路
模拟练习题,定义两个变量 来记录皓仔当前的坐标, 初始的坐标为 。
每次输入 之后, 则下一步的坐标 为 。如果下一步的坐标还在地图内, 也就是 xx >= 1 && xx <= n && yy >= 1 && yy <= n,那么就可以往该坐标移动,并且将本次移动的距离计入在内。
对于平面上的两个点 ,则这两个点之间的距离 。
参考代码
#include<bits/stdc++.h>
using namespace std;
double dist(int x, int y, int a, int b) {
return sqrt(pow(x - a, 2) + pow(y - b, 2));
}
int main(){
int n, m;
cin >> n >> m;
int x = 1, y = 1;
double ans = 0;
for(int i = 1; i <= m; i++) {
int u, d, l, r;
cin >> u >> d >> l >> r;
int xx = x - u + d, yy = y - l + r;
if(xx < 1 || xx > n || yy < 1 || yy > n) continue;
ans += dist(x, y, xx, yy);
x = xx, y = yy;
}
printf("%.2f", ans);
}
T6 皓仔的好数统计
题目大意
定义一个整数是“好数”,当且仅当这个整数的十进制表示中,数字 到 每一种数字出现的次数都不超过 次。
例如:
- 是好数,因为每种数字都只出现了 次;
- 是好数,因为数字 出现了 次,其他数字出现次数都不超过 次;
- 不是好数,因为数字 出现了 次。
现在给定两个整数 ,请你统计从 到 之间一共有多少个好数。
题解思路
判定一个数字是否是一个好数字,可以先做一下数位分解,对于分解出的每一个数字,在桶数组中记录每个数字出现的个数。
然后遍历整个桶数组,但凡一个数字出现两次以上,那么该数字就不是一个好数字。
从 开始遍历到 结束,对于每个数字进行判定,统计好数的总数,最后输出即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int cnt[10];
bool check(int x) {
for(int i = 0; i < 10; i++) cnt[i]=0;
while(x) {
cnt[x % 10]++;
x /= 10;
}
for(int i = 0; i < 10; i++) if(cnt[i] > 2) return false;
return true;
}
int main(){
int l, r;
cin >> l >> r;
int cnt = 0;
for(int i = l; i <= r; i++) if(check(i)) cnt++;
cout << cnt;
}
这里空空如也













有帮助,赞一个