官方题解 | 欢乐赛#52 题解
2025-07-28 13:38:04
发布于:浙江
官方题解 | 欢乐赛#52 题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 | 题目名称 | 题目难度 |
---|---|---|
T1 | 修改数字 | 入门 |
T2 | 小明的非递减数组 | 入门 |
T3 | 小明和视疲劳 | 入门 |
T4 | 卡牌 | 入门 |
T5 | 小明和九宫格 | 入门 |
T6 | 进制转换 | 普及- |
T1 修改数字
题目大意
对于给定的三个数字 ,问是否能够通过最多一次操作使其变成 。
题解思路
记录下三个数字 和 有几处不同,不同的数字数量小于等于 即可
参考代码
#include <iostream>
using namespace std;
int main() {
int a, b,c;
cin >> a >> b >> c;
int cnt = 0;
if(a != 1) cnt++;
if(b != 2) cnt++;
if(c != 3) cnt++;
if(cnt <= 1) cout << "YES";
else cout << "NO";
}
T2 小明的非递减数组
题目大意
对于给定的数组, 每次操作可以使得其中一个数字 ,问最少几次操作可以使得数组成为一个非递减数组?
题解思路
从第 项开始遍历到第 项, 如果 , 则进行 次加一的操作使得 ,最终统计操作的总次数(记得开long long)
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int main(){
int n;
cin >> n;
long long ans = 0;
for(int i =1; i <= n; i++) cin >> a[i];
for(int i = 2; i <= n; i++) {
if(a[i] < a[i - 1]) {
ans += a[i - 1] - a[i];
a[i] = a[i - 1];
}
}
cout << ans << endl;
}
T3 小明和视疲劳
题目大意
对于两个给定的字符串 和 ,问在不区分大小写的情况下二者是否相同?
题解思路
可以将字符串 和 当中所有字母都转换成大写字母,然后直接比较二者是否相同即可。
输入中字符串存在空格,需要使用读取一整行字符串的读入方式。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s, t;
getline(cin, s);
getline(cin, t);
for(int i = 0; i < s.size(); i++) if(s[i] >= 'a' && s[i] <= 'z') s[i] -= 32;
for(int i = 0; i < t.size(); i++) if(t[i] >= 'a' && t[i] <= 'z') t[i] -= 32;
if(s == t) cout << "YES";
else cout << "NO";
}
T4 卡牌
题目大意
存在 张数值是 的卡牌, 张数值是 的卡牌, 张数值是 的卡牌, 张数值是 的卡牌。
现在小明可以从中选取 张卡牌, 请问这 张卡牌的数值总和的最大值是多少?
题解思路
贪心的来看,显然会优先选取卡牌价值为 的卡牌, 如果还能继续选取,则继续选择价值是 的卡牌。最终计算价值的总和。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a, b, c, d, k;
int main()
{
cin >> a >> b >> c >> d >> k;
int ans = 0;
if(k) {
ans += 4 * min(d, k);
k -= min(d, k);
}
if(k) {
ans += 3 * min(c, k);
k -= min(c, k);
}
if(k) {
ans += 2 * min(b, k);
k -= min(b, k);
}
if(k) {
ans += 1 * min(a, k);
k -= min(a, k);
}
cout << ans << endl;
}
T5 小明和九宫格
题目大意
给定一个 的二维数组 ,求其中是否存在一个 的子矩阵和小明喜欢的九宫格相同,存在的话输出 YES
, 否则输出 NO
。
题解思路
枚举 的子矩阵的左上角, 即行编号从 , 列编号从, 然后判断下以该点为左上角的 的子矩阵和小明喜欢的九宫格是否相同, 只要存在一个相同的就可以输出YES
, 如果遍历了整个二维数组 仍然没有找到相同子矩阵,则输出 NO
。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[1010][1010];
int b[5][5];
bool check(int x, int y) {
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++) if(a[x + i][y + j] != b[i][j]) return false;
return true;
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
}
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++) cin >> b[i][j];
for(int i = 1; i <= n - 2; i++)
for(int j = 1; j <= m - 2; j++) {
if(check(i, j)) {
cout << "YES\n";
return 0;
}
}
cout << "NO\n";
}
T6 进制转换
题目大意
将两个十进制 转换成 进制之后, 然后输出其中字典序较大的一个数字。
题解思路
为了方便直接比较字典序, 可以将进制转换的结果存在两个string字符串中。
使用短除法进行进制转换, 并且将每次得到的数字转化为字符之后拼接在对应的string后面,得到一个从最低位开始到最高位的 进制 string。 将string翻转之后就得到我们想要的数字,可以手动遍历将string进行翻转, 也可以直接使用reverse函数。 最后将得到的两个字符串比较字典序之后输出其中较大的字符串。
参考代码
#include<bits/stdc++.h>
using namespace std;
char ch(int x) {
if(x < 10) return '0' + x;
return 'A' + x - 10;
}
int main(){
string A, B;
int a, b, r;
cin >> a >> b >> r;
while(a) {
A += ch(a % r);
a /= r;
}
while(b) {
B += ch(b % r);
b /= r;
}
reverse(A.begin(), A.end());
reverse(B.begin(), B.end());
if(A > B) cout << A;
else cout << B;
}
全部评论 1
T4題目是不是打错了?
昨天 来自 香港
0
有帮助,赞一个