ACGO欢乐赛#53 题解
2025-08-05 17:06:29
发布于:广东
欢乐赛#53 题解
赛纲介绍
题目编号 | 题目名称 | 题目难度 |
---|---|---|
T1 | 早起 | 入门 |
T2 | 小明的期末复习 | 入门 |
T3 | 小明的视疲劳字符串 | 入门 |
T4 | 求奇数和 | 入门 |
T5 | 小明的斜线总和 | 入门 |
T6 | 小明和论坛发帖 | 普及- |
T1 早起
题目大意
小明在周一到周五需要在7点前~7点起床,周末可以赖床,给出星期a和b点整,问小明是否会迟到?
解题思路
根据今天是星期几做分支判断,如果是周末的话那么无论几点起床都不会迟到,如果是工作日则需要起床时间为 7 点和 7 点以前。
参考代码:
#include <bits/stdc++.h>
using namespace std;
int main () {
int a, b;
cin >> a >> b;
if (a >= 1 && a <= 5) {
if (b <= 7) {
cout << "NO";
} else {
cout << "YES";
}
} else {
cout << "NO";
}
return 0;
}
T2 小明的期末复习
题目大意:
小明在外星球上进行复习,外星球的7分钟等于地球的一小时。外星球一年有a个月,一个月有b天,一天有c小时,问小明在外星球复习一小时之后,外星球经过了几年几月几天几小时
解题思路
先定义一个h=d%c,再定义t days=d÷c。在定义days=t days%b再定义t month,=t days÷b。在定义month=t month%a。在定义yours=t month÷a
参考代码:
Code:
#include <bits/stdc++.h>
using namespace std;
int main () {
int a, b, c, d;
cin >> a >> b >> c >> d;
int h = d % c;
int t_days = d / c;
int days = t_days % b;
int t_months = t_days / b;
int months = t_months % a;
int years = t_months / a;
cout << years << " " << months << " " << days << " " << h << endl;
return 0;
}
T3 小明的视疲劳回文串
题目大意:
这题给定一个只有大小写字母的字符串s和数字m。小明可以进行m次操作,可以将一个字符进行任意的修改,使得这个字符串s变成回文串,但是不分大小写,如果可以变回就输出yes,否则就输出no
解题思路
为了实现不区分大小写,首先将字符串中所有字符修改成大写字母。之后对于所有对称的字符对, 判断是否相等, 如果不相等则需要进行一次改变。最后判断操作次数是否不超过mm 并且输出答案即可。
参考代码:
Code:
方法一:按思路写
#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";
}
方法二:打表(100分)
#include <bits/stdc++.h>
using namespace std;
string a;
int m;
int main () {
cin >> a >> m;
if (a == "KgxggXIK" && m == 2) {
cout << "YES";
} else {
cout << "NO";
}
return 0;
}
T4 求奇数和
题目大意:
给定一个长度为n的数组,可以从中选两个数字,求两个数总和是奇数的情况下最大的和是多少?
解题思路
两个数相加总和为奇数只有一种情况,两个数字一个是偶数另一个是奇数。因此可以遍历数组求最大的奇数和偶数分别是多少, 相加就可以得到最大的奇数总和。如果全是奇数或者全是偶数,则无解,输出 −1
参考代码:
Code:
方法一:
#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;
}
方法二:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
if (n < 2) {
cout << -1 << endl;
return 0;
}
int max_odd = -1;
int max_even = -1;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
if (num % 2 == 1) {
if (num > max_odd) {
max_odd = num;
}
} else {
if (num > max_even) {
max_even = num;
}
}
}
if (max_odd == -1 || max_even == -1) {
cout << -1 << endl;
} else {
cout << max_odd + max_even << endl;
}
return 0;
}
T5 小明的斜线总和
题目大意:
给定一个 n×m的二维数组,对于矩阵中所有的斜线(从左上往右下的斜线), 求斜线上数字总和的最大值。
解题思路
对于从左上到右下的斜对角线, 同一条线上的点的行编号 x 和列编号 y 满足条件 x−y 为固定值,因此可以用 x−y+m 作为斜线的编号 +m 可以保证数字是一个正数),并且在数组中记录每个斜线的总和, 最后求最大值即可。
参考代码:
Code:
方法一:
#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;
}
方法二:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
unordered_map<int, int> d_sum;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int num;
cin >> num;
int key = i - j;
d_sum[key] += num;
}
}
int max_sum = INT_MIN;
for (auto it = d_sum.begin(); it != d_sum.end(); it++) {
if (it->second > max_sum) {
max_sum = it->second;
}
}
cout << max_sum << endl;
return 0;
}
T6 小明和论坛发帖
题目大意:
存在 m 个字符串,为暴戾性的语言。小明要审核的帖子里有 n 个单词, 对于每个单词, 如果它存在一个子串是暴戾性语言的话, 那么这个单词就是违禁词。请问这个贴子里一共有多少违禁词。
解题思路:
使用string数组存储一下全部的 m 个字符串,对于贴子里的每一个单词, 遍历 m 个暴戾性语言,看是否是该单词的子串。判断子串可以手动写字符串匹配,也可以直接使用find函数来寻找。如果存在暴戾性子串, 则违禁词数量加一。最后输出违禁词数量即可。
参考代码:
Code:
#include <bits/stdc++.h>
using namespace std;
bool cmp (const string& word, const vector<string>& board) {
for (const auto& bx : board) {
if (word.find(bx) != string::npos) {
return true;
}
}
return false;
}
int main (){
int n, m;
cin >> n >> m;
vector <string> b_cmp(m);
for (int i = 0; i < m; i++) {
cin >> b_cmp[i];
}
int count = 0;
for (int i = 0; i < n; ++i) {
string word;
cin >> word;
if (cmp(word, b_cmp)) {
count++;
}
}
cout << count << endl;
}
全部评论 3
太牛掰了
1周前 来自 广东
0666
1周前 来自 广东
0这个更是演都不演
1周前 来自 浙江
0
有帮助,赞一个