官方题解 | 欢乐赛#76题解
2026-07-01 05:21:35
发布于:浙江
官方题解 | 欢乐赛#76题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的动物园门票 | 入门 |
| T2 | 皓仔的动物园参观 | 入门 |
| T3 | 皓仔统一大小写 | 入门 |
| T4 | 皓仔的森林施法 | 入门 |
| T5 | 皓仔的进制求和 | 普及- |
| T6 | 皓仔的三段数组 | 普及- |
T1 皓仔的动物园门票
题意简述
给定总票价 w 和参加活动的人数 n。
要求计算平均每张动物园门票的价格,并保留 位小数输出。
也就是计算:
解题思路
这是一道简单的实数除法题。
因为总票价 w 可能是实数,所以需要使用 double 类型存储。
读入 w 和 n 后,直接计算 w / n,再使用 printf("%.2f", ...) 输出保留 位小数即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
double w;
int n;
cin >> w >> n;
printf("%.2f", w / n);
return 0;
}
T2 皓仔的动物园参观
题意简述
给定皓仔到达动物园的时间 t。
根据不同时间段输出能看到的动物:
- ,输出
熊猫 - ,输出
猴子 - ,输出
大象 - ,输出
老虎
如果不在这些时间段内,输出 动物园已关闭。
解题思路
这是一道简单的条件判断题。
因为每个时间段都是左闭右开,所以判断时需要注意右端点不能取到。
按照题目给出的时间段依次使用 if else 判断即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
if (t >= 8 && t < 10) {
cout << "熊猫";
} else if (t >= 10 && t < 12) {
cout << "猴子";
} else if (t >= 12 && t < 15) {
cout << "大象";
} else if (t >= 15 && t < 18) {
cout << "老虎";
} else {
cout << "动物园已关闭";
}
return 0;
}
T3 皓仔的统一大小写
题意简述
给定一个只包含英文字母的字符串 s。
每次可以修改一个字符,目标是让字符串变成以下两种情况之一:
所有字母都是大写字母;
所有字母都是小写字母。
输出最少需要修改的字符数量。
解题思路
统计字符串中大写字母的数量 cnt1,以及小写字母的数量 cnt2。
如果要全部变成大写字母,就需要修改所有小写字母,次数为 cnt2。
如果要全部变成小写字母,就需要修改所有大写字母,次数为 cnt1。
答案就是两者的较小值。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
cnt1++;
} else {
cnt2++;
}
}
cout << min(cnt1, cnt2);
return 0;
}
T4 皓仔的森林施法
题意简述
有一个 的森林,最开始每棵树高度都是 。
接下来有 次施法,每次给出 a、b、x,表示第 a 行第 b 列的树长高 米。
同一棵树可能被多次施法,高度会累加。
最后输出最高的树所在的位置,题目保证最终最高的树唯一。
解题思路
用二维数组 h 记录每棵树当前的高度。
每次读入一次施法操作后,执行:
h[a][b] += x
然后判断这棵树的高度是否超过当前记录的最大高度。
如果超过,就更新最高树的位置。
由于 最大可以到 ,并且同一棵树可能多次累加,所以高度要使用 long long 存储。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
long long h[1010][1010];
int main() {
int n, m;
cin >> n >> m;
long long ma = 0;
int ansx = 1;
int ansy = 1;
for (int i = 1; i <= m; i++) {
int a, b;
long long x;
cin >> a >> b >> x;
h[a][b] += x;
if (h[a][b] > ma) {
ma = h[a][b];
ansx = a;
ansy = b;
}
}
cout << ansx << " " << ansy;
return 0;
}
T5 皓仔的进制求和
题意简述
给定 个数字,每个数字由字符串 s 和进制 b 表示。
需要把每个数字从 b 进制转换成十进制,然后求出所有数字的总和。
数字中可能出现:
0 到 9 表示 到 ;
A 到 F 表示 到 。
解题思路
对于每个字符串 s,从左到右依次处理每一位。
假设当前已经转换出的十进制值为 num,当前字符对应的数值为 x,那么更新方式为:
这样就可以将整个 b 进制数字转换为十进制。
由于答案最大不超过 ,所以总和以及每个转换后的数字都要使用 long long 存储。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int get(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
}
return c - 'A' + 10;
}
int main() {
int n;
cin >> n;
long long ans = 0;
for (int i = 1; i <= n; i++) {
string s;
int b;
cin >> s >> b;
long long num = 0;
for (int j = 0; j < s.size(); j++) {
num = num * b + get(s[j]);
}
ans += num;
}
cout << ans;
return 0;
}
T6 皓仔的三段数组
题意简述
给定一个长度为 的正整数数组。
现在需要选择两个分割位置,把数组分成连续的三段,并且每一段都不能为空。
对于每一种分法,分别计算三段元素和 s1、s2、s3。
要求最小化:
输出这个最小值。
解题思路
因为 ,可以直接枚举两个分割位置。
设第一个分割位置为 i,第二个分割位置为 j,那么三段分别是:
第 段: 到 i
第 段:i + 1 到 j
第 段:j + 1 到 n
为了快速求每一段的和,可以先预处理前缀和数组 s。
这样每一段的和都可以 求出。
最后枚举所有合法分法,更新答案即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
long long a[510];
long long s[510];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
long long ans = 1e18;
for (int i = 1; i <= n - 2; i++) {
for (int j = i + 1; j <= n - 1; j++) {
long long s1 = s[i];
long long s2 = s[j] - s[i];
long long s3 = s[n] - s[j];
long long mx = max(s1, max(s2, s3));
long long mn = min(s1, min(s2, s3));
ans = min(ans, mx - mn);
}
}
cout << ans;
return 0;
}
全部评论 4
1
2天前 来自 浙江
2.
2小时前 来自 浙江
01
19小时前 来自 重庆
01
19小时前 来自 重庆
0



























有帮助,赞一个