官方题解 | 欢乐赛#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;
}
全部评论 19
1
5天前 来自 浙江
101
昨天 来自 广东
8aaa
昨天 来自 广东
7bbb
17小时前 来自 浙江
3
aaa
2天前 来自 四川
6bbb
17小时前 来自 浙江
0
aaa
2天前 来自 四川
2bbb
17小时前 来自 浙江
0
第五题难了我1天
1小时前 来自 浙江
1aaa
昨天 来自 广东
11
3天前 来自 重庆
1上榜了?!
48分钟前 来自 浙江
0666
16小时前 来自 浙江
0666
16小时前 来自 浙江
0666
16小时前 来自 浙江
0666
16小时前 来自 浙江
0666
16小时前 来自 浙江
0you
21小时前 来自 广东
0aaa
昨天 来自 广东
0bbb
17小时前 来自 浙江
1ccc
17小时前 来自 浙江
0
1
昨天 来自 广东
0aaa
2天前 来自 四川
0.
3天前 来自 浙江
01
3天前 来自 重庆
0


















































有帮助,赞一个