官方题解 | 欢乐赛#81题解
2026-09-09 09:56:34
发布于:浙江
前言
以下为欢乐赛#81的题解内容,各位小伙伴有什么问题与建议可以在帖子下方留言。
赛纲介绍
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔算平均数 | 入门 |
| T2 | 皓仔看日历 | 入门 |
| T3 | 皓仔的相邻字母 | 入门 |
| T4 | 皓仔的俯瞰森林 | 入门 |
| T5 | 皓仔逛超市 | 普及- |
| T6 | 皓仔的苹果分级 | 普及- |
T1 皓仔算平均数
题意简述
输入三个正整数 、 和 ,计算这三个数字的平均数,并将结果四舍五入保留 位小数。
解题思路
三个数的平均数就是三个数的和除以 。
由于 、、 最大可以达到 ,三个数的和最大为 ,已经超过 int 的范围,因此需要使用 long long 存储这三个数。
计算平均数时除以 ,使计算结果为浮点数。
最后使用 printf("%.2f", ans) 输出,即可将结果四舍五入保留 位小数。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
long long a, b, c;
cin >> a >> b >> c;
double ans = (a + b + c) / 3.0;
printf("%.2f\n", ans);
return 0;
}
T2 皓仔看日历
题意简述
输入三个年份 、 和 ,判断每个年份是平年还是闰年,并计算这三个年份一共包含多少天。
闰年有 天,平年有 天。
解题思路
对于每一个年份 ,判断它是否为闰年。
一个年份是闰年,当且仅当满足下面两个条件之一:
- 能被 整除;
- 能被 整除,并且不能被 整除。
可以写成判断条件:
y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)
如果当前年份是闰年,就给答案加上 ,否则加上 。
分别处理三个年份后,输出总天数即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int y1, y2, y3;
cin >> y1 >> y2 >> y3;
int ans = 0;
if (y1 % 400 == 0 || (y1 % 4 == 0 && y1 % 100 != 0))
ans += 366;
else
ans += 365;
if (y2 % 400 == 0 || (y2 % 4 == 0 && y2 % 100 != 0))
ans += 366;
else
ans += 365;
if (y3 % 400 == 0 || (y3 % 4 == 0 && y3 % 100 != 0))
ans += 366;
else
ans += 365;
cout << ans << '\n';
return 0;
}
T3 皓仔的相邻字母
题意简述
给定一个只由大小写英文字母组成的字符串 。
如果一对相邻字符同为大写字母,或者同为小写字母,那么它们就是一对同类字符。
统计字符串中一共有多少对同类字符。
解题思路
从左到右枚举每一对相邻字符 和 。
用两个 bool 变量分别记录这两个字符是否为大写字母。
如果两个 bool 变量的值相同,说明两个字符要么都是大写字母,要么都是小写字母,此时答案加 。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int ans = 0;
for (int i = 0; i + 1 < s.size(); i++) {
bool x = (s[i] >= 'A' && s[i] <= 'Z');
bool y = (s[i + 1] >= 'A' && s[i + 1] <= 'Z');
if (x == y) ans++;
}
cout << ans << '\n';
return 0;
}
T4 皓仔俯瞰森林
题意简述
给定一个 行 列的森林,每个位置的树木高度为 。
计算每一行所有树木的高度总和,并求出其中最大的行高度总和与最小的行高度总和。
解题思路
依次读入每一行的数据,并用变量 记录当前这一行的高度总和。
一行读入完成后,用 更新最大值 和最小值 。
由于每个高度最大为 ,每行最多有 个数,因此一行的高度总和最大可以达到 ,需要使用 long long 存储。
不需要保存整个矩阵,只需要在读入时直接计算每一行的总和即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
long long mx = LLONG_MIN;
long long mn = LLONG_MAX;
for (int i = 1; i <= n; i++) {
long long sum = 0;
for (int j = 1; j <= m; j++) {
long long x;
cin >> x;
sum += x;
}
if (sum > mx) mx = sum;
if (sum < mn) mn = sum;
}
cout << mx << ' ' << mn << '\n';
return 0;
}
T5 皓仔逛超市
题意简述
皓仔有 元钱,需要按照顺序检查 件物品。
只有价格为质数的物品才会考虑购买。如果钱足够就购买,否则立即结束购物。若剩余的钱变为 ,也立即结束购物。
求皓仔最终购买了多少件物品。
解题思路
从前往后依次枚举每件物品。
对于当前物品价格 ,先判断它是否为质数。判断质数时,只需要枚举到 :
- 如果 ,一定不是质数;
- 如果存在 到 之间的整数能够整除 ,则不是质数;
- 否则就是质数。
如果当前价格不是质数,直接跳过。
如果是质数,则判断剩余的钱 是否足够购买:
- 如果 ,立即结束购物;
- 否则购买物品,将 减去 ,购买数量加 ;
- 如果此时 ,立即结束购物。
由于 ,每次判断质数最多枚举约 次,因此可以直接判断。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
int main() {
int n, M;
cin >> n >> M;
int ans = 0;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
if (!isPrime(x)) continue;
if (M < x) break;
M -= x;
ans++;
if (M == 0) break;
}
cout << ans << '\n';
return 0;
}
T6 皓仔的苹果分级
题意简述
有 筐苹果,第 筐苹果有甜度 、大小 和苹果数量 。
将所有苹果筐按照以下规则排序:
- 按 从大到小排序;
- 如果相同,按 从大到小排序;
- 如果仍然相同,按输入顺序从小到大排序。
排序后的前 筐中,每个苹果售价为 元,其余筐中每个苹果售价为 元,求卖出所有苹果后的总收入。
解题思路
使用结构体保存每筐苹果的甜度 、大小 、苹果数量 和原来的编号 。
按照题目要求编写排序规则:
- 如果 不同,则较大的排在前面;
- 如果 相同,则 较大的排在前面;
- 如果 也相同,则原编号 较小的排在前面。
排序完成后,枚举所有苹果筐:
- 前 筐的苹果数量乘以 ;
- 其余苹果筐的苹果数量乘以 。
将所有收入累加即可。
由于总收入可能很大,需要使用 long long 存储答案。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
struct Apple {
long long s, z, c;
int id;
};
bool cmp(Apple a, Apple b) {
if (a.s + a.z != b.s + b.z) return a.s + a.z > b.s + b.z;
if (a.s != b.s) return a.s > b.s;
return a.id < b.id;
}
int main() {
int n, m;
long long p1, p2;
cin >> n >> m >> p1 >> p2;
Apple a[200005];
for (int i = 1; i <= n; i++) {
cin >> a[i].s >> a[i].z >> a[i].c;
a[i].id = i;
}
sort(a + 1, a + n + 1, cmp);
long long ans = 0;
for (int i = 1; i <= n; i++) {
if (i <= m) ans += a[i].c * p1;
else ans += a[i].c * p2;
}
cout << ans << '\n';
return 0;
}
全部评论 40
qp
1周前 来自 浙江
19?
4天前 来自 浙江
11
3天前 来自 浙江
8
666讨论区没一个正经发言
6天前 来自 湖北
18没错,基本上都在说《《刷个罐头》》
4天前 来自 浙江
9
3天前 来自 浙江
81
54分钟前 来自 浙江
0
刷个罐头
6天前 来自 内蒙古
12
3天前 来自 浙江
3
555
1周前 来自 浙江
11?
4天前 来自 浙江
1
3天前 来自 浙江
0
555
1周前 来自 浙江
5?
4天前 来自 浙江
0
欢乐赛不是你好老师出题解吗?
6天前 来自 重庆
4h6小时前 来自 浙江
1?欢乐赛换负责人了?
20小时前 来自 浙江
1qqqq
2天前 来自 浙江
1111111111111111111
2天前 来自 浙江
1111111111111111111111111111111111111111111111111111111111111
2天前 来自 浙江
11
2天前 来自 浙江
11
2天前 来自 浙江
1
4天前 来自 湖北
1刷个罐头
4天前 来自 北京
1刷个罐头
5天前 来自 新疆
1嗯,对我很有帮助
5天前 来自 新疆
1+1
4天前 来自 浙江
0
w
6天前 来自 浙江
11
28分钟前 来自 浙江
0我发现欢乐赛都是皓仔
54分钟前 来自 新疆
0




























































有帮助,赞一个