# 官方题解 | 欢乐赛#72题解
2026-05-06 12:41:53
发布于:浙江
官方题解 | 欢乐赛#72题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的末四位数 | 入门 |
| T2 | 皓仔今天做什么 | 入门 |
| T3 | 皓仔的彩旗布置 | 入门 |
| T4 | 皓仔的热门数字 | 入门 |
| T5 | 皓仔的奥利奥 | 普及- |
| T6 | 皓仔的队伍整理 | 普及- |
T1 皓仔的末四位数
题目大意
读入一个整数,输出它的后四位数字。
注意:
如果后四位中前面有多余的 ,输出时不要保留这些前导零。
如果最后四位只有 , 则直接输出 即可。
例如:
- 如果后四位是 ,那么只输出
- 如果后四位是 ,那么输出
题解思路
一个数字的后四位数, 可以通过对 取余得到。
因此本题输入数字 之后,直接输出 即可。题目说明可以忽略前导零,因此当数字不足四位时候也可以直接输出。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
cout<<n%10000;
}
T2 皓仔今天干什么
题目大意
皓仔准备根据今天的气温来安排自己的活动。
现在给定今天的气温 ,皓仔会按照下面的规则决定自己做什么:
- 如果气温小于 ,那么皓仔觉得太冷了,会待在家里,输出
Stay Home - 如果气温不少于 且小于 ,那么皓仔会出门散步,输出
Go Walking - 如果气温不少于 ,那么皓仔会出门打篮球,输出
Play Basketball - 请你根据输入的气温,输出皓仔今天的安排。
题解思路
多分支练习题: 首先定义 三个变量输入今天的温度,然后根据题目做以下判断:
-
时候,待在家里,输出
Stay Home -
否则如果 ,则出门散步,输出
Go Walking -
否则说明温度大于 输出
Play Basketball
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(n<10){
cout<<"Stay Home";
}else if(n<20){
cout<<"Go Walking";
}else{
cout<<"Play Basketball";
}
return 0;
}
T3 皓仔的彩旗布置
题目大意
一共有 面彩旗,编号为 到 。一开始,所有彩旗的颜色都是 ,表示还没有上色。
接下来,皓仔会进行 次涂色操作。
每次操作会给出两个整数 ,表示把第 面彩旗染成颜色 。
如果某一面彩旗被多次涂色,那么最后一次涂上的颜色才是最终颜色。
请你在所有操作结束后,输出这 面彩旗最终的颜色。
题解思路
使用数组来表示所有彩旗的颜色, 数组内元素初始值为 。
在循环输入整个数组之后,开始进行 次操作, 每一次输入要染色的旗子 和颜色 之后,直接对数组进行修改:a[x] = c 。
最后遍历整个数组并且输出即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int main(){
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; i++) {
int x, c;
cin >> x >> c;
a[x] = c;
}
for(int i = 1; i <= n; i++) cout << a[i] << ' ';
}
T4 皓仔的热门数字
题目大意
给定 个整数,问在这 个数中,哪个数字出现的次数最多。
如果有多个数字出现次数并列最多,那么输出其中数值最小的那个。
请你帮皓仔找出这个数字。
题解思路
本题数据范围较小,可以直接循环嵌套完成最小数值的求解。
枚举每一个数字 , 然后遍历整个数组看有多少个数字和 相等。
将遍历得到的相同数字数量 和 当前数字 , 与目前得到的最大数量 以及当前答案 做一个对比。
如果 或者出现次数一样但是 比 更小,则更新一下答案。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int main(){
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n ;
int ma = 0, ans;
for(int i = 1; i <= n; i++) {
int c;
cin >> c;
a[i] = c;
}
for(int i = 1; i <= n; i++) {
int cnt = 0;
for(int j = 1; j <= n; j++) {
if(a[j] == a[i]) cnt++;
}
if(cnt > ma) {
ans = a[i];
ma = cnt;
}
else if(cnt == ma && a[i] < ans) {
ans = a[i];
}
}
cout << ans << endl;
}
T5 皓仔的奥利奥
题目大意
给定一个 行 列的数字矩阵,其中一个 的九宫格如果满足以下条件,那么看起来像“奥利奥夹心”。
- 第 行的 个数全部是奇数
- 第 行的 个数全部是偶数
- 第 行的 个数全部是奇数
在整个矩阵中对于所有满足要求的“奥利奥九宫格”,求出九宫格元素和的最大值。
题解思路
可以直接枚举所有的九宫格并且进行判定。
首先可以枚举九宫格的左上角坐标 , 注意行下标的枚举范围是 到 , 列下标的枚举范围是 到 。那么此时就可以得到行下标为 ,列下标为 的一个九宫格。
题目要求其中第一行第三行都是奇数,第二行是偶数。
因此可以先设定一个标记 flag = true 默认该九宫格是奥利奥九宫格,然后如果九个点中任一点不符合要求,则将标记改为 false 。
如果最终标记为真, 则统计九宫格的总和并且更新答案的最大值。
需要注意本题的求总和会爆 。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[110][110];
int main(){
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
int c = a[i][j];
}
}
long long ans = -1;
for(int i = 1; i <= n - 2; i++) {
for(int j = 1; j <= m - 2; j++) {
bool flag = true;
long long sum = 0;
for(int k = j; k <= j + 2; k++) {
if(a[i][k] % 2 == 0 || a[i + 2][k] % 2 == 0) flag = false;
if(a[i + 1][k] % 2 == 1) flag = false;
sum += 0LL + a[i][k] + a[i + 1][k] + a[i + 2][k];
}
if(flag) ans = max(ans, sum);
}
}
cout << ans << endl;
}
T6 皓仔的队伍整理
题目大意
一共有 名同学排成一队,编号为 到 。第 名同学都有两个属性:
- 身高
- 体重
接下来进行 次整理队伍的操作。每次操作都会给出一个区间 和一种排序方式:
- 如果操作类型是 ,就把当前队伍中第 个到第 个位置上的同学,按照体重从小到大排序
- 如果操作类型是 ,就把当前队伍中第 个到第 个位置上的同学,按照身高从小到大排序
如果排序时有两个同学对应属性相同,则编号较小的同学排在前面。
所有操作完成后,请你输出最终队伍中每个位置上的同学编号。
题解思路
结构体排序的练习题, 本题中每个学生同时有身高,体重以及编号三个个信息,因此考虑用结构体数组进行存储。
本题中有两种操作类型分别是按照体重排序以及按照身高排序,因此可以手动写两个比较函数 cmp1 以及 cmp2 两个函数分别使用体重和身高进行排序。
对于每一次输入,根据操作类型进行对应的排序,最终输出排序后的学生编号就好。
参考代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int h, w, id;
}a[5010];
bool cmp1(node x, node y) {
if(x.w != y.w) return x.w < y.w;
return x.id < y.id;
}
bool cmp2(node x, node y) {
if(x.h != y.h) return x.h < y.h;
return x.id < y.id;
}
int main(){
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++) {
int h, w;
cin >> h >> w;
a[i] = {h, w, i};
}
for(int i = 1; i <= m; i++) {
int op, l, r;
cin >> op >> l >> r;
if(op == 1) sort(a + l, a + r + 1, cmp1);
else sort(a + l, a + r + 1, cmp2);
}
for(int i = 1; i <= n; i++) cout << a[i].id << ' ';
}
这里空空如也











有帮助,赞一个