官方题解 | 欢乐赛#60 题解
2025-11-18 04:38:32
发布于:浙江
官方题解 | 欢乐赛#60 题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 小明的动物园门票 | 入门 |
| T2 | 小明的食物投喂 | 入门 |
| T3 | 人气比拼 | 入门 |
| T4 | 点名 | 入门 |
| T5 | 小海狮的连击 | 普及- |
| T6 | 领地计算 | 普及- |
T1 赛跑
题目大意
动物园的成人票一张 元,学生票一张 元。问两个成人和一个学生需要花多少钱买票。
题解思路
成人票一张 元,学生票一张 元,那么两个成人和一个学生的门票当然为 。
参考代码
#include <iostream>
using namespace std;
int main() {
long long a, b;
cin >> a >> b;
long long ans = (2 * a + b) * 0.6;
cout << ans << endl;
return 0;
}
T2 小明的食物投喂
题目大意
便利店里一根香蕉 元, 一个汉堡包 元, 如果经费足够同时购买 根香蕉和 个汉堡的话, 小明会先买一个汉堡然后把剩下所有钱用来买香蕉,否则小明会只购买一个汉堡。问小明购买完物品之后,手上还剩下多少元钱?
题解思路
本题需要先判断一下 根香蕉和 个汉堡 的价格能否支付得起。如果可以支付的话那么将剩下的金额 除以 取余数。否则的话只购买一个汉堡,答案为 。
参考代码
#include <iostream>
using namespace std;
int main() {
long long n, a, b;
cin >> n >> a >> b;
if(a * 10 + b <= n) cout << (n - b) % a << endl;
else cout << n - b << endl;
return 0;
}
T3 人气比拼
题目大意
现在动物园里一共有 只动物,每只动物都有自己的人气值 ,并且每只动物都归属于两个势力其中之一。一个势力的人气值为势力内所有动物人气值的总和。
小明可以选择一只动物,使得它改换到另一个阵营。问最终人气值的差值最小是多少?
题解思路
本题可以先按照变化之前的情况,计算一下两个阵营的人气值分别是多少。
而后小明可以选择枚举每一只动物, 考虑将其转换到另一个阵营, 那么当前阵营的人气值减去该动物的人气值 , 另一阵营的人气值加上 。 在所有情况中找出两个阵营人气差距最小的情况。
参考代码
#include <iostream>
using namespace std;
int v[100010], t[100010];
int n, l, r;
int main() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> v[i] >> t[i];
if(t[i] == 0) l+=v[i];
else r += v[i];
}
int ans = abs(l - r);
for(int i = 1; i <= n; i++) {
int ll = l, rr = r;
if(t[i] == 0) {
ll -= v[i];
rr += v[i];
}
else{
ll += v[i];
rr -= v[i];
}
ans = min(ans, abs(ll - rr));
}
cout << ans << endl;
}
T4 点名
题目大意
名单给定 个字符串, 而后给出 个查询, 每次查询问一个字符串是否在名单中出现过。
题解思路
本题对于学习过 的同学可以直接使用 来快速解决。
本题考虑朴素的查询方法,对于每一个询问,遍历整个名单查找是否出现过这个名字,出现过的话则输出该字符串。
参考代码
#include <iostream>
using namespace std;
int n, m;
string a[100010];
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
for(int i = 1; i <= m; i++) {
bool f = false;
string s; cin >> s;
for(int j = 1; j <= n; j++) {
if(a[j] == s) f = true;
}
if(f) cout << s << endl;
}
}
// map解法
#include <iostream>
#include<map>
using namespace std;
int n, m;
int main() {
cin >> n >> m;
map<string, int> mp;
for(int i = 1; i <= n; i++) {
string s;
cin >> s;
mp[s]++;
}
for(int i = 1; i <= m; i++) {
string s; cin >> s;
if(mp.count(s)) cout << s << endl;
}
}
T5 小海狮的连击
题目大意
给定一个长度为 的数组 , 如果当前的数字 严格大于此前所有数字的平均值,那么连击次数 , 否则连击次数会回到 次。
题解思路
本题数据范围较大, 的最大值为 。 如果直接枚举前面所有数字的总和进而求平均数, 则复杂度为 , 运行超时。因此可以设置一个累加器 记录到目前为止所有数字, 每次可以直接 来求平均数。
参考代码
#include <iostream>
#include<map>
using namespace std;
int n, m;
int main() {
cin >> n;
int ans = 1;
int sum = 0, res = 1;
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
// x 和 平均数 sum / i - 1 作比较, 为了避免浮点误差,改成乘法来做
if(x * (i - 1) > sum) res++;
else res = 1;
sum += x;
ans = max(ans, res);
}
cout << ans << endl;
}
T6 领地计算
题目大意
动物园是一个 的一个二维方阵, 现在有 只动物,每只动物会对以点 为中心, 边长为 的正方形区域释放一份属于自己势力的气息。
一个位置最终属于哪一方取决于哪一方在此处释放的气息更多,如果一个坐标双方势力释放的气息一样多,则该位置属于无主之地。问今天狮子帮和老虎帮的领地分别占据了几个位置?
题解思路
每只动物会对以点 为中心, 边长为 的正方形区域产生影响,我们考虑设置狮子帮的气息为 , 老虎帮为 。在我们记录每一只动物的贡献并且计算之后,最终地图上的点如果是正数则是狮子帮的领地,如果是负数则是老虎帮的领地。
参考代码
#include <iostream>
using namespace std;
int a[510][510];
int main() {
int n, m;
cin >> n >> m;
while(m--) {
int x, y, d, t;
cin >> x >> y >> d >> t;
for(int i = max(1, x - d / 2); i <= min(n, x + d / 2); i++)
for(int j = max(1, y - d / 2); j <= min(n, y + d / 2); j++) {
if(t == 0) a[i][j]++;
else a[i][j]--;
}
}
int ans1 = 0, ans2 = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(a[i][j] > 0) ans1++;
else if(a[i][j] < 0)ans2++;
}
cout << ans1 << ' ' << ans2 << endl;
return 0;
}
全部评论 2
第三题不对吧?没导入那个min的头文件
2025-11-19 来自 江苏
1对,要有algorithm库
2025-11-20 来自 福建
1嗯
2025-11-20 来自 江苏
1
第一题当时不是题目还写了向下取整吗
2025-11-19 来自 浙江
0

















有帮助,赞一个