本文将深入探讨AtCoder Beginner Contest 142中的前四道题目。这些题目主要面向算法竞赛的初学者,涵盖了概率计算、条件判断、思维逻辑和基本数学知识等多个方面。我们将详细分析每道题目的问题背景、解题思路,并提供相应的C++代码实现。通过学习这些题目,读者可以巩固基础知识,提升解题能力,为后续的算法竞赛打下坚实的基础。
AtCoder Beginner Contest 142 题解关键点
概率计算:A题考察了基本的概率计算能力,需要计算奇数出现的概率。
条件判断:B题涉及条件判断,需要根据身高条件判断哪些朋友可以乘坐过山车。
思维逻辑:C题需要根据学生进入教室的记录,逆向推导出进入顺序,考察逻辑思维。
数学知识:D题涉及求最大公约数(GCD)和互质的概念,需要一定的数学基础。
AtCoder Beginner Contest 142 题解
A - Odds of Oddness:奇数的概率
a题要求计算从1到n的整数中,随机选择一个整数,该整数为奇数的概率。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

给定一个整数N,你需要计算从1到N的整数中,随机选择一个数为奇数的概率。这道题目的关键在于理解概率的计算方法,以及如何快速统计奇数的数量。因为N的范围较小(1
首先,我们需要统计从1到N的整数中,奇数的数量。如果N是奇数,那么奇数的数量就是(N + 1) / 2。如果N是偶数,那么奇数的数量就是N / 2。
然后,计算奇数出现的概率。概率等于奇数的数量除以总数的数量,即奇数的数量除以N。
最后,输出计算结果。由于题目没有明确要求输出格式,我们可以直接输出浮点数结果。
C++ 代码实现:
#include#include using namespace std; int main() { int n; cin >> n; int oddCount = (n + 1) / 2; if (n % 2 == 0) { oddCount = n / 2; } double probability = (double)oddCount / n; cout << fixed << setprecision(10) << probability << endl; return 0; }
这段代码首先读取输入的整数N,然后计算奇数的数量,最后计算并输出奇数出现的概率。使用fixed和setprecision(10)可以确保输出结果精确到小数点后10位。
通过这道题目,我们复习了基本的概率计算方法,以及如何使用循环遍历来解决问题。在实际的算法竞赛中,这种简单直接的解决方案往往是最有效的。
B - Roller Coaster:过山车
B题是一个简单的条件判断问题。

有N个朋友想来主题公园玩,要乘坐最受欢迎的过山车,乘坐过山车需要身高至少达到K厘米。现在给出每个朋友的身高,问有多少个朋友可以乘坐过山车。这道题目的关键在于理解题意,以及如何使用循环和条件判断来解决问题。
首先,读取输入的N和K,以及每个朋友的身高。
然后,使用循环遍历每个朋友的身高,判断是否大于等于K。如果大于等于K,那么计数器加1。
最后,输出计数器的值,即可以乘坐过山车的朋友的数量。
C++ 代码实现:
#includeusing namespace std; int main() { int n, k; cin >> n >> k; int count = 0; for (int i = 0; i < n; ++i) { int height; cin >> height; if (height >= k) { count++; } } cout << count << endl; return 0; }
这段代码首先读取输入的N和K,然后循环读取每个朋友的身高,并使用条件判断来统计可以乘坐过山车的朋友的数量。最后,输出计数器的值。
通过这道题目,我们复习了基本的条件判断和循环遍历,以及如何使用计数器来解决问题。在实际的算法竞赛中,这种简单直接的解决方案往往是最有效的。
C - Go to School:去学校
C题是一个思维逻辑题目,需要根据学生进入教室的记录,逆向推导出进入顺序。

Takahashi老师负责一个有N个学生的班级。学生们被赋予了从1到N的不同的学号。今天,所有学生都在不同的时间进入了教室。根据Takahashi老师的记录,当学号为i的学生进入教室时,教室里有A_i个学生(包括学生i)。根据这些记录,重建学生进入教室的顺序。这道题目的关键在于理解题意,以及如何根据给定的信息逆向推导出进入顺序。
首先,读取输入的N,以及每个学生进入教室时,教室里已有的学生数量A_i。
然后,创建一个数组,用于存储学生进入教室的顺序。初始化所有元素为0。
接下来,从后往前遍历A_i数组,找到最后一个进入教室的学生。最后一个进入教室的学生,就是A_i值为N的学生。因为当该学生进入教室时,教室里已经有N个学生了,所以该学生是最后一个进入教室的。
然后,将该学生的学号存储到结果数组的最后一个位置。
接下来,将该学生的A_i值设置为-1,表示该学生已经处理过了。
重复上述步骤,直到所有学生都处理完毕。最终,结果数组中存储的就是学生进入教室的顺序。
C++ 代码实现:
#include#include using namespace std; int main() { int n; cin >> n; vector a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } vector result(n); vector visited(n, false); for (int j = n - 1; j >= 0; --j) { int last = -1; for (int i = 0; i < n; ++i) { if (!visited[i] && a[i] == j + 1) { last = i; visited[i] = true; result[j] = i + 1; break; } } } for (int i = 0; i < n; ++i) { cout << result[i] << " "; } cout << endl; return 0; }
这段代码首先读取输入的N和A_i数组,然后创建一个结果数组和访问数组,用于存储学生进入教室的顺序和标记学生是否已经处理过。然后,从后往前遍历A_i数组,找到最后一个进入教室的学生,并将其学号存储到结果数组的最后一个位置。最后,输出结果数组。
通过这道题目,我们学习了如何根据给定的信息逆向推导出进入顺序,以及如何使用数组和循环来解决问题。在实际的算法竞赛中,这种思维逻辑题目往往需要我们灵活运用已有的知识,才能找到正确的解决方案。
D - Disjoint Set of Common Divisors:公共约数的不相交集合
D题是一个数论题目,涉及求最大公约数(GCD)和互质的概念。

给定两个正整数A和B,让我们选择一些A和B的正的公共约数,使得任何两个被选择的约数必须是互质的。最多能选择多少个约数?这道题目的关键在于理解GCD和互质的概念,以及如何找到最多的互质的公共约数。
首先,我们需要找到A和B的最大公约数GCD(A, B)。然后,找到GCD(A, B)的所有约数。这些约数就是A和B的公共约数。
然后,我们需要从这些公共约数中,选择一些约数,使得任何两个被选择的约数都是互质的。为了使得选择的约数数量最多,我们可以选择所有的质数因子。因为质数因子之间都是互质的。
C++ 代码实现:
#include#include #include #include using namespace std; long long gcd(long long a, long long b) { if (b == 0) { return a; } return gcd(b, a % b); } int main() { long long a, b; cin >> a >> b; long long common = gcd(a, b); vector factors; for (long long i = 1; i * i <= common; ++i) { if (common % i == 0) { factors.push_back(i); if (i * i != common) { factors.push_back(common / i); } } } sort(factors.begin(), factors.end()); int count = 0; for(int i = 0; i < factors.size(); ++i) { if (factors[i] == 1){ count++; } } long long ans = 0; if (factors.size() > 0) ans = 1; cout << factors.size() << endl; return 0; }
这段代码首先读取输入的A和B,然后计算A和B的最大公约数GCD(A, B),然后找到GCD(A, B)的所有约数,存储到factors向量中。然后,统计factors向量的大小,即公共约数的数量。最后,输出公共约数的数量。
表格总结
| 步骤 | 描述 |
|---|---|
| 1 | 计算A和B的最大公约数GCD(A, B) |
| 2 | 找到GCD(A, B)的所有约数 |
| 3 | 统计约数的数量 |
| 4 | 输出约数的数量 |
通过这道题目,我们学习了如何计算最大公约数和约数,以及如何使用向量和排序来解决问题。在实际的算法竞赛中,这种数论题目往往需要我们具备一定的数学基础,才能找到正确的解决方案。
如何有效利用算法竞赛资源
选择合适的练习平台
选择适合自己的在线算法竞赛平台是提高编程技能的关键。

AtCoder 是一个非常好的选择,它提供了各种难度级别的题目,特别是适合初学者的AtCoder Beginner Contest。此外,Codeforces 和 LeetCode 也是非常流行的平台,它们提供了大量的题目和竞赛,可以帮助你不断提升算法能力。
系统学习算法和数据结构
算法和数据结构是解决算法竞赛题目的基础。你需要系统地学习常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划、贪心算法等)。建议通过阅读经典的算法书籍(如《算法导论》、《算法》)和参加在线课程来系统学习。

另外,理解不同算法的时间复杂度和空间复杂度对于优化代码至关重要。
多做练习,注重总结和反思
仅仅学习理论知识是不够的,你需要通过大量的练习来巩固所学知识。AtCoder Beginner Contest提供了一个很好的练习机会。每次完成比赛后,都要认真分析自己的解题思路,总结经验教训。对于没有解决的题目,要认真学习题解,理解正确的解题思路,并尝试自己实现代码。

AtCoder Beginner Contest的优势与不足
? Pros题目难度适中,适合初学者入门。
题目类型丰富,可以全面提升算法能力。
平台界面友好,用户体验良好。
提供多种编程语言支持,方便选手选择。
? Cons题目描述为日文,需要一定的翻译能力。
比赛时间不固定,可能不适合所有选手。
题目难度可能对高级选手来说偏低。
需要一定的网络条件,才能顺利参加比赛。
AtCoder Beginner Contest 常见问题解答
AtCoder Beginner Contest适合什么样的参赛者?
AtCoder Beginner Contest(ABC)主要面向算法竞赛初学者和中级选手。题目难度通常从非常基础到中等难度,适合希望提高算法编程能力的人参加。
如何提高在AtCoder Beginner Contest中的表现?
提高在ABC中的表现需要系统的学习和练习。首先,你需要掌握基本的算法和数据结构知识。其次,多做练习,特别是AtCoder上的题目。最后,认真分析自己的解题思路,总结经验教训,不断提升解题能力。
AtCoder Beginner Contest的题目类型有哪些?
ABC的题目类型通常包括:概率计算、条件判断、逻辑思维、数学知识、字符串处理、排序、搜索、动态规划、贪心算法等。题目类型丰富多样,可以帮助你全面提升算法能力。
相关问题拓展
除了AtCoder,还有哪些适合初学者的算法竞赛平台?
除了AtCoder,还有很多适合初学者的算法竞赛平台。 Codeforces 和 LeetCode 是非常流行的平台,它们提供了大量的题目和竞赛,可以帮助你不断提升算法能力。此外,HackerRank 和 Project Euler 也是不错的选择。HackerRank提供了各种难度级别的题目,可以帮助你巩固基础知识。Project Euler则侧重于数学和编程的结合,可以提高你的数学思维能力。 在选择平台时,可以根据自己的需求和兴趣进行选择。如果希望提高算法编程能力,可以选择AtCoder、Codeforces和LeetCode。如果希望提高数学思维能力,可以选择Project Euler。无论选择哪个平台,都需要坚持练习,才能不断提升自己的算法能力。 同时,也需要注意,算法竞赛不仅仅是关于代码和算法,还需要具备一定的数学基础和逻辑思维能力。因此,在学习算法和数据结构的同时,也要注重提高自己的数学和逻辑思维能力。可以通过阅读数学书籍、参加数学竞赛等方式来提高数学能力。可以通过做一些逻辑推理题目、玩一些益智游戏等方式来提高逻辑思维能力。 总之,提高在算法竞赛中的表现需要系统的学习和练习,同时也要注重提高自己的数学和逻辑思维能力。希望本文能够帮助你更好地入门算法竞赛,并在算法学习的道路上越走越远。









