官方题解 | 欢乐赛#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;
}
全部评论 2

8小时前 来自 广东
1d
11小时前 来自 浙江
1

























有帮助,赞一个