# 官方题解 | 欢乐赛#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;
}
全部评论 4
为什么欢乐赛都这么难啊,555,欺负新手

2025-09-02 来自 浙江
1《新手》
2025-09-02 来自 浙江
0《初次参加排位于2024.3.3
2025-09-02 来自 上海
0可是我真的是新手啊
2025-09-02 来自 浙江
1
我有个问题,为啥卧底不喝椰汁,但是特点是我喝椰汁就是卧底

2025-09-06 来自 上海
0“WO”在神秘语言中是“并非”的意思(一本正经胡说八道
2025-09-06 来自 广东
0#define WO !
2025-09-06 来自 上海
0
没人评论

2025-09-02 来自 重庆
0沙发
2025-09-02 来自 重庆
0沙发已经长白毛了……
2025-09-02 来自 重庆
0沙发已经弗兰了
2025-09-02 来自 上海
0沙发已经散架了(((
2025-09-03 来自 重庆
0























有帮助,赞一个