官方题解 | 欢乐赛#77题解
2026-07-15 14:46:23
发布于:浙江
官方题解 | 欢乐赛#77题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔看时间 | 入门 |
| T2 | 皓仔的铁人三项 | 入门 |
| T3 | 皓仔找元音 | 入门 |
| T4 | 皓仔截取数字 | 入门 |
| T5 | 皓仔的进制回文数 | 普及- |
| T6 | 皓仔的队伍排序 | 普及- |
T1 皓仔看时间
题意简述
给定当前时间的小时 h 和分钟 m。
要求按照 hh:mm 的格式输出时间。
如果小时或分钟不足 位,需要在前面补 。
解题思路
这是一道格式化输出题。
小时和分钟都要固定输出 位,可以使用 printf 的格式控制:
%02d 表示输出一个整数,并且宽度为 位,不足 位时在前面补 。
所以直接输出:
printf("%02d:%02d", h, m);
即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int h, m;
cin >> h >> m;
printf("%02d:%02d", h, m);
return 0;
}
T2 皓仔的铁人三项
题意简述
给定皓仔在铁人三项中三个项目的排名 a、b、c。
如果满足下面任意一个条件,就可以获奖:
三个项目都排在前 名;
至少有一个项目排在前 名。
如果可以获奖,输出 Award,否则输出 No Award。
解题思路
直接按照题意进行条件判断。
第一种获奖情况:
a <= 5 && b <= 5 && c <= 5
第二种获奖情况:
a <= 2 || b <= 2 || c <= 2
只要两个条件中有一个成立,就输出 Award。
否则输出 No Award。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if ((a <= 5 && b <= 5 && c <= 5) || (a <= 2 || b <= 2 || c <= 2)) {
cout << "Award";
} else {
cout << "No Award";
}
return 0;
}
T3 皓仔找元音
题意简述
给定一个只包含小写英文字母的字符串 s。
需要找出其中所有元音字母,并按照它们在原字符串中出现的顺序输出。
元音字母包括:
a`、`e`、`i`、`o`、`u
如果字符串中没有任何元音字母,则输出 -1。
解题思路
从前往后遍历字符串 s。
如果当前字符是 a、e、i、o、u 中的一个,就输出这个字符,并记录已经找到过元音字母。
遍历结束后,如果没有找到任何元音字母,就输出 -1。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
bool ok = false;
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {
cout << s[i];
ok = true;
}
}
if (ok == false) {
cout << -1;
}
return 0;
}
T4 皓仔截取数字
题意简述
给定 次询问。
每次给出一个数字 x 和一个整数 m,要求输出数字 x 最右侧长度为 m 的部分。
注意截取结果中的前导零需要保留。
解题思路
因为题目要求保留截取结果中的前导零,所以适合把数字 x 当作字符串读入。
对于字符串 s,如果它的长度为 len,那么最右侧长度为 m 的部分就是从下标 len - m 开始一直到末尾的字符。
直接循环输出这一段即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
while (n--) {
string s;
int m;
cin >> s >> m;
int len = s.size();
for (int i = len - m; i < len; i++) {
cout << s[i];
}
cout << endl;
}
return 0;
}
T5 皓仔的进制回文数
题意简述
给定三个整数 l、r、x。
要求统计区间 中有多少个整数,在转换成 x 进制后是回文数。
回文数指转换后的表示从左往右读和从右往左读完全相同。
解题思路
因为 ,可以直接枚举区间 中的每一个整数。
对于每个数:
先把它转换成 x 进制;
然后判断转换后的结果是否为回文串。
进制转换时,可以不断对 x 取余:
n % x 得到当前最低位;
n /= x 去掉最低位。
因为判断回文时只需要比较两端是否相同,所以可以把每一位存入数组,然后用双指针判断。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[100];
bool check(int n, int x) {
int len = 0;
while (n > 0) {
len++;
a[len] = n % x;
n /= x;
}
int l = 1;
int r = len;
while (l < r) {
if (a[l] != a[r]) {
return false;
}
l++;
r--;
}
return true;
}
int main() {
int l, r, x;
cin >> l >> r >> x;
int ans = 0;
for (int i = l; i <= r; i++) {
if (check(i, x)) {
ans++;
}
}
cout << ans;
return 0;
}
T6 皓仔的队伍排序
题意简述
给定 名学生的信息,包括出生年月日、身高和姓名。
需要按照下面规则排序:
首先身高更高的排在前面;
如果身高相同,则年龄更大的排在前面,也就是出生日期更早的排在前面。
最后按排序后的顺序输出每名学生的姓名。
解题思路
用结构体数组保存每名学生的信息。
排序时按照题目规则写比较函数:
如果两名学生身高不同,则身高高的排在前面;
如果身高相同,则比较出生日期,出生年份更小的年龄更大;
如果年份相同,再比较月份;
如果月份相同,再比较日期。
题目保证不会有两名学生在同一天出生,所以不需要继续比较姓名。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
struct student {
int year;
int month;
int day;
int height;
string name;
};
student a[1010];
bool cmp(student x, student y) {
if (x.height != y.height) {
return x.height > y.height;
}
if (x.year != y.year) {
return x.year < y.year;
}
if (x.month != y.month) {
return x.month < y.month;
}
return x.day < y.day;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].year >> a[i].month >> a[i].day >> a[i].height >> a[i].name;
}
sort(a + 1, a + 1 + n, cmp);
for (int i = 1; i <= n; i++) {
cout << a[i].name << endl;
}
return 0;
}
全部评论 19
NB!
2天前 来自 浙江
19互赞的回复
昨天 来自 浙江
13+1
15小时前 来自 新疆
11一起刷罐
3小时前 来自 浙江
7

2天前 来自 广东
16
3小时前 来自 广东
5




1小时前 来自 广东
1
d
2天前 来自 浙江
12
1小时前 来自 广东
1






昨天 来自 重庆
9互赞
昨天 来自 陕西
4+1
15小时前 来自 新疆
0
d
昨天 来自 浙江
3d
昨天 来自 浙江
1
d
昨天 来自 浙江
3
1小时前 来自 广东
1

昨天 来自 广东
21
1小时前 来自 河北
11
1小时前 来自 河北
11
1小时前 来自 河北
11
1小时前 来自 河北
1d
1小时前 来自 浙江
0d
1小时前 来自 浙江
0d
1小时前 来自 浙江
01
1小时前 来自 河北
0124
1小时前 来自 河北
01111
1小时前 来自 河北
0114514
1小时前 来自 河北
0



















































有帮助,赞一个