ACGO欢乐赛#55|非官方题解
2025-09-03 19:45:46
发布于:浙江
非官方题解哦,官方题解
比赛题目
T1.奇数判断
知识点:分支结构
题目:
小明十分喜欢奇数,最近他学习了四则运算,并且写出了一个式子 a×b−c。
现在给你三个整数 a,b,c,请你判断这是否是一个奇数。
简化:
就是三个数,然后算a * b - c是否是个奇数
俺的方法:
我用的是三目运算符,你也可以直接分支判断
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cin >> a >> b >> c;
cout << ((a * b - c) % 2 == 1 ? "Yes" : "No");
return 0;
}
分支长这样:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cin >> a >> b >> c;
if((a * b - c) % 2 == 1) cout << "Yes";
else cout << "No";
return 0;
}
T2.小明和神秘宝箱
知识点:循环
题目:
经过在ACGO平台的大量刷题,小明获取了 n 个神秘宝箱。让小明头疼的是, 神秘宝箱掉落的金币数量是随机的,第 i 个宝箱可以得到的金币数最少是 li, 最大是 ri 。
请问开启了全部 n个宝箱后, 小明能够获得的最少金币数和最大金币数分别是多少?
简化:
就是有n行,每行2个数,最少也就是第一个数全部加起来,最大也就是第二个数全部加起来
俺的方法:
就是利用循环,每次循环输入两个数x,y,然后用两个计数变量minn,maxx,分别加上这两个数
#include<bits/stdc++.h>
using namespace std;
int main(){
long long minn = 0,maxx = 0,n;
cin >> n;
for(int i = 1;i <= n;i++){
int x,y;
cin >> x >> y;
minn += x;
maxx += y;
}
cout << minn << " " << maxx;
return 0;
}
T3.找出卧底
知识点:循环 判断
题目:
小明得到情报,在他的团队里里出现了敌方派来的卧底,他现在急需找出这个卧底。
间谍的特点就是不喝椰汁,小明计划根据这个特点来快速判断一个人是不是卧底。
现在得到了 n 个由大小写字母构成的字符串 s1,s2,...,sn,代表了 n 个队员的特点, 如果在不区分大小写的情况下,特点信息和字符串"WOHEYEZHI"一致, 则这个队员是一个卧底。
简化:
就是有n行,每行一个名字,转大写后和"WOHEYEZHI"作比较
俺的方法:
就是利用循环,每次循环输入一个名字,转大写后和"WOHEYEZHI"作比较,一样加一,否则没有否则
#include<bits/stdc++.h>
using namespace std;
string big(string s){ //转大写
for(int i = 0;i < s.size();i++) s[i] = toupper(s[i]);
return s;
}
int main(){
int n,ans = 0;
cin >> n;
for(int i = 1;i <= n;i++){
string s;
cin >> s;
if(big(s) == "WOHEYEZHI"){
ans++;
}
}
cout << ans;
return 0;
}
T4.寻找最小公倍数
知识点:循环 基础数学知识——最小公倍数
题目:
给定一个长度为 n 的数组,对于数组中所有的数对 ai , aj (1 ≤ i,j ≤ n), 求 ai 和 aj 的最小公倍数的最大值
俺的方法:
就是利用循环,每次找两个数,然后求最小公倍数,最后求最大值
#include<bits/stdc++.h>
using namespace std;
int gcd(int x, int y) {
while (y != 0) {
int temp = y;
y = x % y;
x = temp;
}
return x;
}
int lcm(int x, int y) {
return (x / gcd(x, y)) * y;
}
int main(){
int n,maxx = INT_MIN;
cin >> n;
int a[n + 5];
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= n;i++){
for(int j = i + 1;j <= n;j++){
maxx = max(maxx,lcm(a[i],a[j]));
}
}
cout << maxx;
return 0;
}
T5.对称矩阵
知识点:循环
题目:
给定一个n×n(n为偶数)的矩阵, 如果这个矩阵左右对称并且上下也对称,那我们称之为对称矩阵。请你判断该矩阵是否是对称矩阵。如果是对称矩阵,输出YES,否则输出NO.
本题有多组测试样例,请对每一组样例分别计算并输出答案。
俺的方法:
需要思考一下:
现在有一个
行\列 | 1 | 2 |
---|---|---|
1 | 1 | 1 |
2 | 1 | 0 |
这样的矩阵
那么对应一下:
- 左右对称:1-1对应1-2,2-1对应2-2,发现没,两个坐标的 i 相同,而 j 其实在样例里的第二个数据里可以体现,为 j 和 n - j + 1
- 上下对称:1-1对应2-1,1-2对应2-2,发现没,两个坐标的 j 相同,而 i 其实在样例里的第二个数据里可以体现,为 i 和 n - i + 1
那么利用这个规律写,就很简单啦
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
cin >> T;
while(T--){
int n;
cin >> n;
int a[n + 5][n + 5];
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cin >> a[i][j];
}
}
bool flag1 = true,flag2 = true;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(a[i][j] != a[i][n - j + 1]) flag1 = false;
if(a[i][j] != a[n - i + 1][j]) flag2 = false;
}
}
if(flag1 && flag2) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
T6.宝石项链
知识点:map 异或
题目:
小明获得了一条美丽的宝石项链, 上面有 n 个颜色各异的宝石,第 i 宝石的颜色使用数字 ai 来表示。
在一串项链中,对于同一种颜色的宝石, 会产生一定的的美丽值,美丽值为该颜色宝石的颜色值 × 所有该颜色宝石的编号的异或和(异或和为所有数连续异或的结果),整个项链的美丽值为每一种颜色宝石产生的美丽值的总和。
请问对于给定的宝石项链, 整串项链的美丽值是多少?
俺的方法:
利用map来计算,map的第一项为数值,第二项为异或和
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
map<int, long long> m;
for (int i = 1; i <= n;i++) {
int x;
cin >> x;
m[x] ^= i;
}
long long ans = 0;
for (auto& x : m) {
ans += x.first * x.second;
}
cout << ans << endl;
return 0;
}
有帮助,赞一个