欢乐赛#55非官方题解
2025-09-03 10:33:56
发布于:北京
1.A70081 奇数判断
问题分析题目要求判断表达式 的结果是否为奇数。
我们可以利用奇偶性的运算规律来高效解决这个问题,而不必关心具体数值的大小。
奇偶性运算规律:
- 偶数 × 任何数 = 偶数
- 奇数 × 奇数 = 奇数
- 奇数 - 偶数 = 奇数
- 偶数 - 奇数 = 奇数
- 奇数 - 奇数 = 偶数
- 偶数 - 偶数 = 偶数
AC代码:
#include <iostream>
using namespace std;
int main() {
int a, b, c;
// 读取输入的三个整数
cin >> a >> b >> c;
// 判断a×b是否为奇数(只有a和b都为奇数时,乘积才是奇数)
bool productIsOdd = (a % 2 == 1) && (b % 2 == 1);
// 判断c是否为奇数
bool cIsOdd = (c % 2 == 1);
// 当乘积和c的奇偶性不同时,结果为奇数
if (productIsOdd != cIsOdd) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
2. A70082.小明和神秘宝箱
一、问题分析
题目要求计算小明开启所有宝箱后能获得的最少金币数和最大金币数。每个宝箱有一个最小金币数和最大金币数,我们需要:
- 计算所有宝箱最小金币数的总和(最少金币数)
- 计算所有宝箱最大金币数的总和(最大金币数)
这是一个简单的求和问题,只需要遍历所有宝箱,分别累加最小和最大值即可。
AC代码:
#include <iostream>
using namespace std;
int main() {
// 由于数值可能很大(1e5个1e9的数相加),需要用long long类型
long long min_sum = 0, max_sum = 0;
int n;
// 读取宝箱数量
cin >> n;
// 循环读取每个宝箱的最小和最大值,并累加
for (int i = 0; i < n; ++i) {
int l, r;
cin >> l >> r;
min_sum += l; // 累加最小金币数
max_sum += r; // 累加最大金币数
}
// 输出结果
cout << min_sum << " " << max_sum << endl;
return 0;
}
3.A70083 找出卧底
问题分析
题目要求找出团队中的卧底,卧底的特点是其信息字符串在不区分大小写的情况下与 "WOHEYEZHI" 完全一致。
解题关键:
- 不区分大小写比较字符串
- 统计与目标字符串匹配的数量
AC代码:
#include <iostream>
#include <string>
#include <cctype> // 包含tolower函数
using namespace std;
// 将字符串转换为全小写
string toLower(const string &s) {
string res;
for (char c : s) {
res += tolower(c);
}
return res;
}
int main() {
int n;
cin >> n;
// 目标字符串的小写形式
string target = "woheyezhi";
int count = 0;
for (int i = 0; i < n; ++i) {
string s;
cin >> s;
// 转换为小写后比较
if (toLower(s) == target) {
count++;
}
}
cout << count << endl;
return 0;
}
4.A70084 寻找最小公倍数的 C++ 题解
一、问题分析
题目要求在一个数组中,找出所有可能的数对 的最小公倍数,并 LCM,并求出其中的最大值。
关键知识点:
最小公倍数与最大公约数(GCD)的关系:LCM (a, b) = (a × b) / GCD (a, b)
需要检查数组中所有可能的数对(包括 i = j 的情况)
AC代码:
#include <iostream>
#include <vector>
#include <algorithm> // 用于__gcd函数
using namespace std;
// 计算两个数的最小公倍数
long long lcm(int a, int b) {
// 使用long long避免乘法溢出
return (long long)a * b / __gcd(a, b);
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
long long max_lcm_val = 0;
// 检查所有可能的数对
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
long long current_lcm = lcm(arr[i], arr[j]);
if (current_lcm > max_lcm_val) {
max_lcm_val = current_lcm;
}
}
}
cout << max_lcm_val << endl;
return 0;
}
5.A70085 对称矩阵的 C++ 题解
问题分析
题目要求判断一个 n×n(n 为偶数)的矩阵是否同时满足左右对称和上下对称:
- 左右对称:对于矩阵中任意元素 matrix [i][j],它应该等于 matrix [i][n-1-j]
- 上下对称:对于矩阵中任意元素 matrix [i][j],它应该等于 matrix [n-1-i][j]
由于矩阵同时需要满足这两种对称性,我们需要对每个元素检查这两个条件。
AC代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
// 读取矩阵
vector<vector<int>> matrix(n, vector<int>(n));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> matrix[i][j];
}
}
bool isSymmetric = true;
// 检查所有元素是否满足对称性
for (int i = 0; i < n && isSymmetric; ++i) {
for (int j = 0; j < n && isSymmetric; ++j) {
// 计算对称位置的索引
int mirror_i = n - 1 - i; // 上下对称的行索引
int mirror_j = n - 1 - j; // 左右对称的列索引
// 检查上下对称和左右对称
if (matrix[i][j] != matrix[mirror_i][j] ||
matrix[i][j] != matrix[i][mirror_j]) {
isSymmetric = false;
}
}
}
cout << (isSymmetric ? "YES" : "NO") << '\n';
}
return 0;
}
6.A70086 宝石项链
问题分析
题目要求计算宝石项链的美丽值,计算规则如下:
- 将宝石项链中的宝石按颜色分组
- 对于每种颜色,计算该颜色所有宝石编号的异或和
- 每种颜色的美丽值 = 颜色值 × 该颜色编号的异或和
- 总美丽值 = 所有颜色美丽值的总和
关键点:
- 宝石编号从 1 开始(不是 0)
- 需要高效分组统计每种颜色的编号异或和
AC代码:
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
// 哈希表存储:颜色 -> 该颜色所有编号的异或和
unordered_map<int, int> xor_sum;
for (int i = 0; i < n; ++i) {
int color = a[i];
int index = i + 1; // 编号从1开始
// 如果是第一次遇到该颜色,初始化异或和为当前编号
// 否则,与当前编号进行异或运算
if (xor_sum.find(color) == xor_sum.end()) {
xor_sum[color] = index;
} else {
xor_sum[color] ^= index;
}
}
// 计算总美丽值
long long total = 0;
for (const auto& pair : xor_sum) {
total += (long long)pair.first * pair.second;
}
cout << total << endl;
return 0;
}
这里空空如也
有帮助,赞一个