# 官方题解 | 欢乐赛#62 题解
2025-12-15 20:06:48
发布于:浙江
官方题解 | 欢乐赛#62 题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的上课迟到 | 入门 |
| T2 | 皓仔吃水果 | 入门 |
| T3 | 皓仔的数字分割 | 入门 |
| T4 | 皓仔的平行四边形计数 | 入门 |
| T5 | 皓仔数星星 | 普及- |
| T6 | 皓仔的BCD码 | 普及- |
T1 皓仔的上课迟到
题目大意
皓仔和陈老师约定今天晚上 来上信奥课,不过由于皓仔路上堵车, 他在约定时间的 分钟后才进入课堂。问今晚皓仔和陈老师的课是什么时候开始的?
题解思路
分钟也就是 小时加上 分钟,因此最终时针为 , 分针为 (注意保留两位整数输出)
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[2000010], n, s, m;
int main() {
int h = 18, m = 0;
int x;
cin >> x;
h += x / 60; m += x % 60;
printf("%02d:%02d", h, m);
}
T2 皓仔吃水果
题目大意
皓仔吃水果的要求是每一块水果的重量要在 克到 克之间 重量小于 克的水果块他不会吃, 重量大于 克的水果皓仔会吃掉 克。
现在一共有 块水果摆在皓仔眼前,他会逐一的按照自己的习惯尝试吃掉所有的水果,请问最后皓仔一共吃掉了几克水果?
题解思路
循环结构输入所有水果的重量 ,只有当水果的值超出 的情况下才会吃,但是吃下的数量不会超过 克, 因此最终摄入的重量为 。 将每一个水果吃下的重量累加即可得到答案。
参考代码
#include <iostream>
using namespace std;
int w[1000010], h[1000010];
int main() {
int n, a, ans = 0;
cin >> n >> a;
for(int i = 1; i <= n; i++) cin >> w[i];
for(int i = 1; i <= n; i++) cin >> h[i];
for(int i = 1; i <= n; i++) {
if(w[i] >= a) ans = max(ans, h[i]);
}
cout << ans << endl;
}
T3 皓仔的数字分割
题目大意
给定一个很大的数字,而后将其按照 个一段进行分割,分别输出。
题解思路
由于数字太大,字符串输入数字,每 个字符输出一次,并且加上空格即可,最后一段的长度可能不是恰好 个,只需要将剩余的所有字符都输出即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
int k;
cin >> s >> k;
for(int i = 0; i < s.size(); i += k) {
for(int j = i; j < min((int)s.size(), i + k); j++) cout <<s[j];
cout << ' ';
}
}
T4 皓仔的平行四边形计数
题目大意
给定 个数字, 请问在所有的四元组 里 , 一共有多少种选择可以拼出一个平行四边形。
题解思路
平行四边形需要有两对相等的边,也就是 ,因此可以四重循环枚举所有的四元组,为了方便进行平行四边形的判定,可以将四条边进行排序。排序之后判定较小的两条边 是否相等,较大的两条边 $c,d $是否相等即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int a[110], n;
cin >> n;
int ans = 0;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
for(int k = j + 1; k <= n; k++)
for(int t = k + 1; t <= n; t++){
int b = a[i], c = a[j], d = a[k], e = a[t];
if(b > d) swap(b, d);
if(b > e) swap(b, e);
if(c > d) swap(c, d);
if(c > e) swap(c, e);
if(b == c && d == e) ans++;
}
cout << ans << endl;
}
T5 皓仔数星星
题目大意
皓仔肉眼可见的星空是一片 的网格, 个星星点缀期间,每一颗星星的坐标是 。
望远镜一次可以观察并且记录下来的视野是一片宽度为 , 高度为 的星空,皓仔快速地连续拍摄了 张照片, 每一张照片记录的星空区域是左上角为 的一片区域, 数一数有多少星星没有拍到.
题解思路
可以考虑直接使用二维数组记录每一个星星的位置,对于每一张照片,可以循环遍历枚举整个照片里的每一个位置,
参考代码
#include <bits/stdc++.h>
using namespace std;
int cnt[5010][5010];
int main() {
int n, m, w, h;
cin >> n >> m >> h >> w;
for(int i = 1; i <= n; i++) {
int x, y;
cin >> x >> y;
cnt[x][y] = 1;
}
for(int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
for(int j = x; j <= min(5000, x + h - 1); j++)
for(int k = y; k <= min(5000, y + w - 1); k++) cnt[j][k] = 0;
}
int ans = 0;
for(int i = 1; i <= 5000; i++)
for(int j = 1; j <= 5000; j++) ans += cnt[i][j];
cout << ans << endl;
}
T6 皓仔的BCD码
题目大意
BCD码会将一个十进制数字的每一个数位都转化成位的二进制数来表示。
例如数字 , 可以转化成 。
其中数字对应了二进制的 ;
数字对应了二进制的 ;
数字对应了二进制的 ;
题解思路
我们只需要将数字的每一位拆分出来,并且转化成一个 位的二进制编码。
数字很大,选择使用字符串输入该数字,而后可以选择进行进制转换,也可以直接写位运算提取其中较低的四位。
参考代码
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
for(int i = 0; i < s.size(); i++) {
int x = s[i] - '0';
cout << ((x >> 3) & 1);
cout << ((x >> 2) & 1);
cout << ((x >> 1) & 1);
cout << ((x >> 0) & 1);
}
return 0;
}
这里空空如也





有帮助,赞一个