官方题解 | 欢乐赛#51 题解
2025-07-07 03:13:51
发布于:浙江
官方题解 | 欢乐赛#51 题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 | 题目名称 | 题目难度 |
---|---|---|
T1 | 石头剪刀布 | 入门 |
T2 | 小明的购物计划 | 入门 |
T3 | ac字符串 | 入门 |
T4 | 四舍五入 | 入门 |
T5 | 小明的bingo | 入门 |
T6 | 3倍 | 普及- |
T1 石头剪刀布
题目大意
输出一个字符使得小明获取胜利。
题解思路
对方出石头,显然我们需要出布,因此输出'C'。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main() {
cout << 'C';
}
T2 小明的购物计划
题目大意
小明去商店购物,不同的结账金额对应了不同的折扣力度,求最终的实际结账金额。
题解思路
使用多分支结构,判断当前的结账金额对应的打折力度,则答案等于结账金额 折扣。
题目要求保留一位小数输出,因此使用printf进行格式化输出。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
double ans = 0;
if(n <= 100) ans = n * 0.8;
else if(n <= 300) ans = n * 0.9;
else if(n <= 500) ans = n * 1;
else ans = n * 1.5;
printf("%.1lf", ans);
}
T3 ac字符串
题目大意
对于给定的字符串 , 求其中有多少个子串为 "ac"并输出。
题解思路
由于想要判断的子串长度只有 ,因此可以直接遍历整个字符串, 如果 和 恰好构成了目标子串"ac",则答案+1。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[100010], b[100010];
int n;
int main()
{
int cnt = 0 ;
string s;
cin >> s;
for(int i = 0; i < s.size() - 1; i++) {
if(s[i] == 'a' &&s[i + 1] == 'c') cnt++;
}
cout << cnt << endl;
}
T4 四舍五入
题目大意
对于给定的数字 (数位很长,需要使用string来进行读入),求将 按照四舍五入保留 位的结果?
题解思路
使用桶数组来存储一下每个密码能够打开的宝箱的数量。 对于每个宝箱, 使得该宝箱的 个密码能够解开的宝箱数量+1.
将数字保留 位进行四舍五入,取决于 第 位,如果第 位大于等于 , 则第 位数值加一。
由于在数字 之后可能会产生进位, 因此需要从后往前维护一下数字的进位, 如果某一位的数字大于 , 则需要设为 ,并且让上一位。
参考代码
#include <bits/stdc++.h>
using namespace std;
int n, m;
int main() {
string s;
cin >> n >> s >> m;
if(s[m + 2] >= '5') s[m + 1]++; //第m+1位,下标为m + 2
for(int i = m + 1; i >= 2; i--) {
if(s[i] > '9') {
s[i] = '0';
if(i == 1)s[i - 2] ++; //下标为2时候,上一位要跳过小数点 因此是 s[i - 2]
else s[i - 1]++;
}
}
cout << s.substr(0, m + 2) << endl;
}
T5 小明的bingo
题目大意
给定一个 的二维数组,对于任何一条长度为 的直线(包括对角线), 如果直线上数字的总和为一个奇数的话,则可以算是一次 bingo
,求bingo
的数量。
题解思路
长度为 的直线一共只有 条,即 行, 列, 主对角线, 副对角线。 因此可以按顺序循环遍历 行, 列, 主对角线, 副对角线,并且计算总和,看本条线上的总和是否是一个奇数,是的话使得答案 +1。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[5010][5010];
int main(){
int n;
cin >> n;
int cnt = 0;
for(int i =1 ; i <= n; i++)
for(int j = 1; j <= n; j++) cin >> a[i][j];
for(int i = 1; i <= n; i++) { //对于每一行进行判断
int sum = 0;
for(int j = 1; j <= n; j++) sum += a[i][j];
if(sum & 1) cnt++; //总和是奇数则答案+1
}
for(int j = 1; j <= n; j++) { //对于每一列进行判断
int sum = 0;
for(int i = 1; i <= n; i++) sum += a[i][j];
if(sum & 1) cnt++; //总和是奇数则答案+1
}
int sum = 0;
int x = 1, y = 1;
while(x <= n && y <= n) {
sum += a[x][y];
x++;
y++;
} //主对角线
if(sum & 1) cnt++;
sum = 0;
x = 1, y = n;
while(x <= n){
sum += a[x][y];
x++;
y--;
} //副对角线
if(sum & 1) cnt++;
cout << cnt << endl;
}
T6 3倍
题目大意
给定一个长度是 的数组, 对于其中所有的差值为 的倍数的数对 , 求其最大的差值并且输出.
题解思路
如果直接枚举所有的数对 ,则复杂度为 , 的上界为,显然超时。
考虑到如果两个数字 的差值为 , 则 。
因此可以将所有数字对 取模, 对于余数是 三种情况分别求最大值和最小值。
最后对三个情况分别使用最大值减去最小值获取对应的最大差值, 在三种结果中取最大即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int inf = 1e9;
int mi[5]= {10000, 10000, 10000}, ma[5];
int n[1000010];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
mi[x % 3] = min(mi[x % 3], x);
ma[x % 3] = max(ma[x % 3], x); //维护最大值和最小值
}
int ans = 0;
for(int i = 0; i < 3; i++) ans = max(ans, ma[i] - mi[i]);
cout << ans << endl;
}
全部评论 4
第一题如果太闲了,可以用if来完成
2025-07-12 来自 福建
0%%%
2025-07-09 来自 浙江
0欢乐赛题解还是太吃操作了(((
2025-07-09 来自 浙江
0
第一题原来这么简单!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2025-07-08 来自 浙江
0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1周前 来自 广东
0
最后一题的测试点是不是改过,打比赛AC,做题就错了最后一个测试点
2025-07-07 来自 江苏
04 900 897 896 2
类似于这样的测试点,你的做法算出来结果是
900-897=3
,但正确的结果应该是896-2=894
。最终的答案应该是在余数分别为 的三组数中出现,而不是第一次找到的那一组。
2025-07-09 来自 浙江
0原来如此,谢谢老师
2025-07-09 来自 浙江
0
有帮助,赞一个