# 官方题解 | 欢乐赛#70题解
2026-04-15 13:48:26
发布于:浙江
官方题解 | 欢乐赛#70题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的1000米成绩 | 入门 |
| T2 | 皓仔的自习室座位 | 入门 |
| T3 | 皓仔的温度记录 | 入门 |
| T4 | 皓仔的皇后棋盘 | 入门 |
| T5 | 皓仔的双重回文数 | 普及- |
| T6 | 皓仔的奖品发放 | 普及- |
T1 皓仔的1000米成绩
题目大意
已知皓仔跑完全程一共用了 秒,请你帮他计算:这个成绩具体是多少分钟多少秒。
题解思路
分钟为 秒,因此将可以将成绩转化为 分, 秒。
在输入数字 之后,直接输出 以及 即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
cout << n / 60 << ' ' << n % 60;
}
T2 皓仔的地理课
题目大意
图书馆门口的电子屏会根据当前情况,给出不同的座位安排建议。
已知以下三个信息:
- 表示当前剩余空位数量;
- 表示是否临近闭馆, 表示临近闭馆, 表示还未临近闭馆。
电子屏会按照下面的规则依次判断:
- 如果临近闭馆,则输出
Go Home - 否则,如果当前没有空位,则输出
No Seat - 否则,如果当前有空位并且空位数量不少于 ,则输出
Quiet Area - 否则,如果当前有空位并且空位数量少于 ,输出
Normal Area
根据输入的信息,输出电子屏给的安排结果。
题解思路
分支嵌套练习题:
当 时, 临近闭关,输出 Go Home;
否则根据空位数量 做出判断:
- 时候没有座位,则输出
No Seat - 否则如果 ,则输出
Quiet Area - 否则输出
Normal Area
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
if(b) cout << "Go Home";
else {
if(!a) cout << "No Seat";
else if(a >= 10) cout << "Quiet Area";
else cout << "Normal Area";
}
}
T3 皓仔的温度记录
题目大意
给出连续 天的温度,如果一段连续 天的温度记录中,最大值与最小值的差小于 ,那么皓仔就认为这 天的温度是“稳定”的。
求一共有多少段连续 天的温度记录满足这个条件。
题解思路
使用一维数组输入整个温度表之后,对数组进行遍历。
我们需要考虑 天的温度记录, 因此可以从 进行枚举。
每次对于从 共计四个数字求出的最大值 以及最小值 , 如果最大值和最小值的差值 小于 , 则答案加一。
最终输出答案即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int main(){
int n, k;
cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
int ans = 0;
for(int i = 1; i + 3 <= n; i++) {
int ma = -2e9, mi = 2e9;
for(int j = i; j < i + 4; j++) {
ma = max(ma, a[j]);
mi = min(mi, a[j]);
}
if(ma - mi < k) ans++;
}
cout << ans << endl;
}
T4 皓仔的皇后棋盘
题目大意
给定一个一个 的棋盘,棋盘上存在一些皇后棋子,皇后可以攻击到与自己在同一行、同一列,以及同一条对角线上的所有位置。
现在棋盘上已经放好了若干个皇后。皓仔想知道,哪些位置会被这些皇后攻击到。
输出一个 的网格:
- 如果某个位置上有皇后,输出
Q - 如果某个位置虽然没有皇后,但能被至少一个皇后攻击到,输出
# - 如果某个位置既没有皇后,也不会被任何皇后攻击到,输出
.
题解思路
对于每一个出现的皇后,首先令皇后所在位置的棋子标记 Q, 对于皇后可以攻击的八个方向进行循环遍历,将范围内不是皇后棋子的点标记为 #。
可以考虑使用方向数组简化代码,使用长度为 的八联通方向数组存储往八个方向移动会产生的坐标变化。
枚举 个方向, 从当前皇后位置出发,一路走到地图边缘,将所有的点标记为 #。假定当前的方向是 , 坐标为 , 那么每行走一步则令 xx += dx[i], yy += dy[i]。
对于当前的坐标 , 可以通过 xx >= 1 && xx <= n && yy >= 1 && yy <= n
来判定是否还在地图范围内。
最终输出整个二维矩阵即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
char a[110][110];
int dx[] = {1, 1, 1, -1, -1, -1, 0, 0};
int dy[] = {1, -1, 0, 1, -1, 0, 1, -1};
int main(){
int n, k;
cin >> n >> k;
while(k--) {
int x, y;
cin >> x >> y;
a[x][y] = 'Q';
for(int t = 0; t < 8; t++) {
int i = x, j = y;
while(1) {
i += dx[t], j += dy[t];
if(i < 1 || i > n || j < 1 || j > n) break;
if(a[i][j] != 'Q') a[i][j] = '#';
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(a[i][j]) cout << a[i][j];
else cout << ".";
}
cout << endl;
}
}
T5 皓仔的双重回文数
题目大意
如果一个整数在 进制表示下是回文数,并且在 进制表示下也是回文数,那么皓仔就称这个数为“双重回文数”。
请你帮皓仔统计,在 到 这些整数中,一共有多少个数是“双重回文数”。
题解思路
注意到本题需要在两种进制下判定转化之后是否是回文数,因此为了简化代码,可以考虑将判定回文的操作封装成自定义函数。
我们设定check(int x, int y) 函数,用来判定在 进制下, 数字 是否是一个回文数。
进制转换直接使用模板, 每次除以 直到数字 归零, 将余数存在数组中。回文数的要求是对称出现的数字需要相同,因此我们遍历左半边的所有数字 a[i],判定是否和右半边对称的数字 a[idx + 1 - i] 相同, 是的话则该数字通过了回文数的判定。
本题需要同时满足在 和 进制下都是回文数,因此可以从 到 遍历,对于循环变量 判定 check(i, x) 和 check(i, y) 是否同时为真,是的话则答案加一,最后输出答案即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[110];
bool check(int x, int y) {
int idx = 0;
while(x) {
a[++idx] = x % y;
x /= y;
}
for(int i = 1; i <= idx / 2; i++)
if(a[i] != a[idx + 1 - i]) return false;
return true;
}
int main(){
int n, x, y;
cin >> n >> x >> y;
int ans = 0;
for(int i = 1; i <= n; i++) {
if(check(i, x) && check(i, y)) ans++;
}
cout << ans;
}
T6 皓仔的奖品发放
题目大意
一共有 名员工和 个奖品。
第 名员工都有一个业绩值,业绩值越高,越早进行奖品选择。如果两名员工的业绩值相同,则编号更小的员工先选。
每个奖品都有一个价值,并且每个奖品只能被选择一次。
同时,每名员工对奖品也有自己的要求。第 名员工只会选择价值在自己预期范围内的奖品,也就是说,他只会选择价值满足 的奖品。
当轮到某名员工选择时:
- 如果当前还有符合他预期范围的奖品,那么他会从中选择价值最高的那个奖品;
- 如果当前没有任何符合条件的奖品,那么他就不选择奖品。
请你输出最终每名员工选择到的奖品价值。如果没有选到奖品,则输出 。
题解思路
本题中每个员工有业绩和编号两个信息,因此在给员工进行排名决定奖品选择顺序的时候,需要使用结构体排序,编写cmp函数时候注意先比较业绩再比较编号.
本题数据范围较小, 对于每一个当前需要选择奖品的员工, 可以直接遍历访问所有的奖品,
当出现第一个价值在 和 之间的奖品时候,选择该奖品, 并且将该奖品的价值修改成 , 代表已经被选择过了。而如果没有找到合适的奖品,则直接输出 即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int l[2005], r[2005];
int gift[2005];
int ans[2005];
struct node {
int id;
long long a;
}p[2010];
bool cmp1(node x, node y) {
if (x.a != y.a) return x.a > y.a;
return x.id < y.id;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> p[i].a;
p[i].id = i;
}
for (int i = 1; i <= n; i++) {
cin >> l[i] >> r[i];
}
for (int i = 1; i <= m; i++) {
cin >> gift[i];
}
sort(p + 1, p + n + 1, cmp1);
sort(gift + 1, gift + m + 1, greater<int> ());
for (int i = 1; i <= n; i++) ans[i] = 0;
for (int i = 1; i <= n; i++) {
int id = p[i].id;
for (int j = 1; j <= m; j++) {
if (gift[j] == -1) continue;
if (gift[j] >= l[id] && gift[j] <= r[id]) {
ans[id] = gift[j];
gift[j] = -1;
break;
}
}
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << ' ';
}
return 0;
}
全部评论 2
a
2026-04-15 来自 浙江
0顶顶顶顶
2026-04-15 来自 广东
0



























有帮助,赞一个