# 官方题解 | 欢乐赛#55 题解
2025-09-02 10:41:35
发布于:浙江
官方题解 | 欢乐赛#55 题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 | 题目名称 | 题目难度 |
---|---|---|
T1 | 奇数判断 | 入门 |
T2 | 小明和神秘宝箱 | 入门 |
T3 | 找出卧底 | 入门 |
T4 | 寻找最小公倍数 | 入门 |
T5 | 对称矩阵 | 入门 |
T6 | 宝石项链 | 普及- |
T1 奇数判断
题目大意
对于给定的三个数字 , 计算式子的结果并且判断是否为奇数?
题解思路
输入, 计算一下 的结果并且判断是否为奇数。是的话输出Yes
, 否则输出No
。
参考代码
#include <iostream>
using namespace std;
int main() {
int a, b,c;
cin >> a >> b >> c;
if((a * b - c) % 2 != 0) cout << "Yes";
else cout << "No";
}
T2 小明和神秘宝箱
题目大意
小明获取了 个神秘宝箱第 个宝箱可以得到的金币数最少是 , 最大是 。
问开启了全部 个宝箱后, 小明能够获得的最少金币数和最大金币数分别是多少?
题解思路
最少金币数为所有宝箱的最少金币 的总和, 最多金币数是所有宝箱的最多金币 的总和。
因此直接循环输入所有的 并且计算总和即可。(本题数字值域较大,记得开
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
long long L = 0, R = 0;
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
int l, r;
cin >> l >> r;
L += l;
R += r;
}
cout << L << ' ' << R << endl;
}
T3 找出卧底
题目大意
对于给定的 个字符串, 求其中有多少个字符串在不区分大小写的情况下和 "WOHEYEZHI" 相同,并且输出对应的个数。
题解思路
本题需要注意,不区分大小写, 因此可以对于输入的字符串的所有字符,全部都转化成大写字母来进行比较。每有字符串和 "WOHEYEZHI" 相同,答案+1。最后输出答案即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int ans = 0;
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
string s;
cin >> s;
for(int j = 0; j < s.size(); j++) if(s[j] >= 'a') s[j] -= 32;
if(s == "WOHEYEZHI") ans++;
}
cout << ans << endl;
}
T4 寻找最小公倍数
题目大意
给定一个长度为 的数组,对于数组中所有的数对 , 求 和 的最小公倍数的最大值。
题解思路
本题的数组长度和值域都很小 ,因此可以写较为朴素暴力的三重循环。首先枚举所有的数对 , 然后再遍历寻找
, 则对应的最小公倍数为 。在所有的最小公倍数中找到最大值并且输出即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a[510];
int ans;
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x=1;
for(int k=a[i];k>=1;k--){
if(a[i]%k==0&&a[j]%k==0){
x=k;
break;
}
}
int num=a[i]*a[j]/x;
ans=max(ans,num);
}
}
cout<<ans<<endl;
return 0;
}
T5 对称矩阵
题目大意
给定一个的矩阵, 如果这个矩阵左右对称并且上下也对称,那我们称之为对称矩阵。请你判断该矩阵是否是对称矩阵。如果是对称矩阵,输出YES
,否则输出NO
.
题解思路
假设该矩阵是一个对称矩阵, 则对于 来说,应当与左右对称的 相同, 并且和上下对称的 相等。
因此遍历整个矩阵,如果每个点都和对应的对称点数值相等, 则该矩阵是一个对称矩阵。
参考代码
#include <iostream>
using namespace std;
int a[1010][1010];
int n;
int main() {
int t;
cin >> t;
while(t--){
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
cin >> a[i][j];
}
bool flag = true;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(a[i][j] != a[n + 1 - i][j] || a[i][j] != a[i][n + 1 - j]) flag = false;
}
if(flag) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
T6 宝石项链
题目大意
给定一个长度是 的数组, 对于其中每一种数值,求该数字出现的所有位置的编号的异或和。最终输出所有异或和的总和。
题解思路
为了将相同类型的数组聚集在一起, 可以使用结构体存储每一个数字以及对应的出现位置。
在按照数值进行结构体排序之后,则所有的相同数字就聚集在一个连续的区间了。 此时可以直接遍历结构体数组并且计算编号的异或和。最后累加所有的异或和得到答案。
(另外可以尝试使用map存储每种数字对应的异或和来快速解答。
参考代码
#include <bits/stdc++.h>
using namespace std;
int n;
struct node
{
long long id;
long long val;
}a[200010];
bool cmp(node a,node b){
if(a.val==b.val){
return a.id<b.id;
}
else{
return a.val<b.val;
}
}
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].val;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
long long ans=0;
long long num=-1;
for(int i=1;i<=n;i++){
if(num==-1){
num=a[i].id;
for(int j=i+1;j<=n;j++){
if(a[j].val==a[i].val){
num=num^a[j].id;
i=j;
}
else{
break;
}
}
}
ans=ans+num*a[i].val;
num=-1;
}
cout<<ans<<endl;
return 0;
}
//---------------以下为map解法
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
map<int, int> mp;
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
mp[x] ^= i;
}
long long ans = 0 ;
for(auto it : mp) {
ans += 1LL * it.first * it.second;
}
cout << ans << endl;
}
全部评论 3
为什么欢乐赛都这么难啊,555,欺负新手
昨天 来自 浙江
1《新手》
昨天 来自 浙江
0《初次参加排位于2024.3.3
昨天 来自 上海
0可是我真的是新手啊
昨天 来自 浙江
1
没人评论
昨天 来自 重庆
0沙发
昨天 来自 重庆
0沙发已经长白毛了……
昨天 来自 重庆
0沙发已经弗兰了
昨天 来自 上海
0沙发已经散架了(((
12小时前 来自 重庆
0
有帮助,赞一个