# 官方题解 | 欢乐赛#53 题解
2025-08-04 10:03:33
发布于:浙江
官方题解 | 欢乐赛#53 题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 | 题目名称 | 题目难度 |
---|---|---|
T1 | 早起 | 入门 |
T2 | 小明的期末复习 | 入门 |
T3 | 小明的视疲劳字符串 | 入门 |
T4 | 求奇数和 | 入门 |
T5 | 小明的斜线总和 | 入门 |
T6 | 小明和论坛发帖 | 普及- |
T1 早起
题目大意
根据今天是星期几以及小明起床的时间判断他今天是否会迟到,是的话输出 YES
, 否则输出 NO
。
题解思路
根据今天是星期几做分支判断,如果是周末的话那么无论几点起床都不会迟到,如果是工作日则需要起床时间为点和 点以前。
参考代码
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
if(a <= 5 && b > 7) cout << "YES\n";
else cout << "NO\n";
}
T2 小明的期末复习
题目大意
外星球的时间计算方法和地球完全不一致, 一年有 个月, 一个月有 天, 一天有 小时。
问当小明在外星球复习了 小时之后, 外星球经过了几年几月几天几小时呢?
题解思路
可以先计算一下在外星球的时间体系中, 一年内的总小时数 year,一个月的总小时数 month。
然后经过的年数 = , 月数 = ,天数 = , 小时数 =
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a, b, c, d;
cin >> a >> b >> c >> d;
int year = a * b * c;
int month = b * c;
cout << d / year << ' ' << d % year / month << ' ' << d % month / c << ' ' << d % c << endl;
}
T3 小明的视疲劳字符串
题目大意
给定一个只有大小写字母的字符串 , 以及数字 。 小明每次操作可以将一个字符进行任意的修改。
能否在不超过 次操作的情况下,使得这个字符串在不区分大小写的情况下变成一个回文串。
题解思路
为了实现不区分大小写,首先将字符串中所有字符修改成大写字母。
之后对于所有对称的字符对, 判断是否相等, 如果不相等则需要进行一次改变。最后判断操作次数是否不超过 并且输出答案即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[100010], b[100010];
int n;
int main()
{
string s;
int m;
cin >> s >> m;
for(int i = 0; i < s.size(); i++) if(s[i] >= 'a' && s[i] <= 'z') s[i] -= 32;
int cnt = 0;
for(int i = 0; i < s.size() / 2; i++) if(s[i] != s[s.size() - 1 - i]) cnt++;
if(cnt <= m) cout << "YES\n";
else cout << "NO\n";
}
T4 求奇数和
题目大意
给定一个长度为 的数组, 可以从中选择两个数字 。求两个数总和是奇数的情况下,最大的和是多少。
题解思路
两个数相加总和为奇数只有一种情况,两个数字一个是偶数另一个是奇数。
因此可以遍历数组求最大的奇数和偶数分别是多少, 相加就可以得到最大的奇数总和。
如果全是奇数或者全是偶数,则无解,输出
参考代码
#include <bits/stdc++.h>
using namespace std;
int n, m;
int cnt[100010];
int main() {
int ma1 = -1, ma2 = -1;
cin >> n;
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
if(x % 2 == 1) ma1 = max(ma1, x);
else ma2 = max(ma2, x);
}
if(ma1 >= 0 && ma2 >= 0) cout << ma1 + ma2 << endl;
else cout << -1 << endl;
}
T5 小明的斜线总和
题目大意
给定一个 的二维数组,对于矩阵中所有的斜线(从左上往右下的斜线), 求斜线上数字总和的最大值。
题解思路
对于从左上到右下的斜对角线, 同一条线上的点的行编号 和列编号 满足条件 为固定值,
因此可以用 作为斜线的编号 ( 可以保证数字是一个正数),并且在数组中记录每个斜线的总和, 最后求最大值即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int ans[100010];
int main(){
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
int x;
cin >> x;
ans[i - j + m] += x;
}
}
int res = -1e9;
for(int i = 1; i <= n + m - 1; i++) res = max(res, ans[i]);
cout << res << endl;
}
T6 小明和论坛发帖
题目大意
存在 个字符串,为暴戾性的语言。
小明要审核的帖子里有 个单词, 对于每个单词, 如果它存在一个子串是暴戾性语言的话, 那么这个单词就是违禁词。
请问这个贴子里一共有多少违禁词。
题解思路
使用string数组存储一下全部的 个字符串,对于贴子里的每一个单词, 遍历 个暴戾性语言,看是否是该单词的子串。判断子串可以手动写字符串匹配,也可以直接使用find函数来寻找。如果存在暴戾性子串, 则违禁词数量加一。
最后输出违禁词数量即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
string s[510];
int n, m;
int main()
{
cin >> n >> m;
for(int i = 1; i <= m; i++) {
cin >> s[i];
}
int ans = 0;
for(int i = 1; i <= n; i++) {
string ss;
cin >> ss;
bool flag = false;
for(int j = 1; j <= m; j++) {
if(ss.find(s[j]) != -1) flag = true;
}
if(flag) ans++;
}
cout << ans << endl;
}
全部评论 4
有实力
11小时前 来自 江苏
0d
2天前 来自 北京
0沙发
2天前 来自 北京
0好厉害
2天前 来自 重庆
0
有帮助,赞一个