官方题解 | 欢乐赛#82题解
2026-09-23 09:41:55
发布于:浙江
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔画三角形 | 入门 |
| T2 | 皓仔拼角 | 入门 |
| T3 | 皓仔整理数组 | 入门 |
| T4 | 皓仔的字母串 | 入门 |
| T5 | 皓仔的数字操作 | 普及- |
| T6 | 皓仔的最近数字 | 普及- |
T1 皓仔画三角形
题意简述
输入一个可见字符 ,使用这个字符输出一个高为 、底边宽度为 的空心三角形。
解题思路
三角形的大小是固定的,因此不需要使用循环,可以直接按照每一行的格式输出。
- 第 行输出 个空格和 个字符 ;
- 第 行输出 个空格、字符 、 个空格和字符 ;
- 第 行连续输出 个字符 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
char c;
cin >> c;
cout << " " << c << '\n';
cout << " " << c << " " << c << '\n';
cout << c << c << c << c << c << '\n';
return 0;
}
T2 皓仔拼角
题意简述
输入两个锐角的度数 和 ,将它们拼在一起后,新角的度数为 。
根据新角与 度的大小关系,判断它是锐角、直角还是钝角。
解题思路
先计算新角的度数 。
- 如果 ,输出
锐角; - 如果 ,输出
直角; - 如果 ,输出
钝角。
直接使用 if 语句进行判断即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int sum = a + b;
if (sum < 90) cout << "锐角";
else if (sum == 90) cout << "直角";
else cout << "钝角";
return 0;
}
T3 皓仔整理数组
题意简述
给定一个长度为 的数组 。
先按照编号从小到大的顺序输出所有奇数编号的元素,再按照编号从大到小的顺序输出所有偶数编号的元素。
解题思路
先读入整个数组。
第一次从前往后枚举所有奇数编号 ,依次输出对应元素。
第二次从后往前枚举所有偶数编号,并依次输出对应元素。
因为数组下标从 开始,所以直接按照题目中的编号进行处理即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[100005];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i += 2) cout << a[i] << ' ';
int start = n;
if (start % 2 == 1) start--;
for (int i = start; i >= 2; i -= 2) cout << a[i] << ' ';
return 0;
}
T4 皓仔的字母串
题意简述
给定 个字符串,对于每个字符串,判断其中是否只包含大写英文字母和小写英文字母。
如果所有字符都是英文字母,输出 yes,否则输出 no。
解题思路
依次处理每个字符串 。
枚举字符串中的每一个字符,判断它是否为大写字母或小写字母。
如果发现某个字符既不是大写字母,也不是小写字母,就说明这个字符串不符合要求。
可以使用一个 bool 变量记录当前字符串是否合法,最后根据结果输出 yes 或 no。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
while (n--) {
string s;
cin >> s;
bool flag = true;
for (int i = 0; i < s.size(); i++) {
bool x = (s[i] >= 'A' && s[i] <= 'Z');
bool y = (s[i] >= 'a' && s[i] <= 'z');
if (!x && !y) {
flag = false;
break;
}
}
if (flag) cout << "yes\n";
else cout << "no\n";
}
return 0;
}
T5 皓仔的数字操作
题意简述
一共有 次操作,每次给出操作编号 和两个正整数 。
- 当 时,求 的最大公约数;
- 当 时,求 的最小公倍数。
对于每次操作输出对应的结果。
解题思路
求最大公约数可以使用辗转相除法。
设当前两个数为 。每轮先计算并保存余数 ,再令 、。重复以上操作,直到 ,此时 就是最大公约数。
设 的最大公约数为 ,则最小公倍数为:
由于最小公倍数可能超过 int 的范围,因此使用 long long 存储数据。
每次求最大公约数的时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
while (b != 0) {
long long r = a % b;
a = b;
b = r;
}
return a;
}
int main() {
int n;
cin >> n;
while (n--) {
int op;
long long a, b;
cin >> op >> a >> b;
long long g = gcd(a, b);
if (op == 1) cout << g << '\n';
else cout << a / g * b << '\n';
}
return 0;
}
T6 皓仔的最近数字
题意简述
有 个数字,需要进行 次查询。
每次给出一个数字 ,在当前还没有被移除的数字中,找到与 的绝对差最小的数字并将其移除。
如果有多个数字的绝对差相同,则选择数值较小的数字。
解题思路
由于 ,可以直接模拟每一次查询。
使用数组 记录每个位置的数字是否已经被移除。
对于每次查询 ,枚举所有还没有被移除的数字,计算:
记录当前绝对差最小的数字。
如果当前数字与 的绝对差更小,就更新答案;如果绝对差相同,则选择数值更小的数字。
找到答案后输出,并将对应位置标记为已经移除。
每次查询最多枚举 个数字,因此时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
long long a[5005];
bool vis[5005];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
while (m--) {
long long x;
cin >> x;
int pos = -1;
long long dis = 9e18;
for (int i = 1; i <= n; i++) {
if (vis[i]) continue;
long long now = abs(a[i] - x);
if (now < dis || (now == dis && a[i] < a[pos])) {
dis = now;
pos = i;
}
}
cout << a[pos] << '\n';
vis[pos] = true;
}
return 0;
}
全部评论 14
uhewiu
1周前 来自 四川
6666
1周前 来自 贵州
6,,,
5天前 来自 四川
56天前 来自 上海
5为什么不是AC君发了
2天前 来自 浙江
1@跑刀鼠||猛攻鼠 行行行,你不是区行了吧,你最厉害了
3天前 来自 重庆
1你看这事闹的,还生气了😭
3天前 来自 重庆
2你和别人玩去,我和SSCD两条你眼里的区钓鱼去了
2天前 来自 浙江
3原谅我吧😭
2天前 来自 重庆
0
方式
2天前 来自 浙江
0水电费
2天前 来自 浙江
0哈哈哈
2天前 来自 浙江
0发过火
2天前 来自 浙江
0牛,666
2天前 来自 浙江
0,tbvcmhvjkguoh
3天前 来自 上海
0,,,
3天前 来自 广西
0,,,
3天前 来自 广西
0



















































有帮助,赞一个