0

0

算法竞赛入门:AtCoder Beginner Contest 142题解

聖光之護

聖光之護

发布时间:2026-01-14 09:36:12

|

206人浏览过

|

来源于php中文网

原创

本文将深入探讨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 模型☜☜☜

算法竞赛入门:AtCoder Beginner Contest 142题解

给定一个整数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,然后计算奇数的数量,最后计算并输出奇数出现的概率。使用fixedsetprecision(10)可以确保输出结果精确到小数点后10位。

通过这道题目,我们复习了基本的概率计算方法,以及如何使用循环遍历来解决问题。在实际的算法竞赛中,这种简单直接的解决方案往往是最有效的。

B - Roller Coaster:过山车

B题是一个简单的条件判断问题。

算法竞赛入门:AtCoder Beginner Contest 142题解

有N个朋友想来主题公园玩,要乘坐最受欢迎的过山车,乘坐过山车需要身高至少达到K厘米。现在给出每个朋友的身高,问有多少个朋友可以乘坐过山车。这道题目的关键在于理解题意,以及如何使用循环和条件判断来解决问题。

首先,读取输入的N和K,以及每个朋友的身高。

然后,使用循环遍历每个朋友的身高,判断是否大于等于K。如果大于等于K,那么计数器加1。

最后,输出计数器的值,即可以乘坐过山车的朋友的数量。

C++ 代码实现

#include 

using 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题是一个思维逻辑题目,需要根据学生进入教室的记录,逆向推导出进入顺序。

算法竞赛入门:AtCoder Beginner Contest 142题解

Takahashi老师负责一个有N个学生的班级。学生们被赋予了从1到N的不同的学号。今天,所有学生都在不同的时间进入了教室。根据Takahashi老师的记录,当学号为i的学生进入教室时,教室里有A_i个学生(包括学生i)。根据这些记录,重建学生进入教室的顺序。这道题目的关键在于理解题意,以及如何根据给定的信息逆向推导出进入顺序。

首先,读取输入的N,以及每个学生进入教室时,教室里已有的学生数量A_i。

然后,创建一个数组,用于存储学生进入教室的顺序。初始化所有元素为0。

接下来,从后往前遍历A_i数组,找到最后一个进入教室的学生。最后一个进入教室的学生,就是A_i值为N的学生。因为当该学生进入教室时,教室里已经有N个学生了,所以该学生是最后一个进入教室的。

然后,将该学生的学号存储到结果数组的最后一个位置。

Animate AI
Animate AI

Animate AI是个一站式AI动画故事视频生成工具

下载

接下来,将该学生的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)和互质的概念。

算法竞赛入门:AtCoder Beginner Contest 142题解

给定两个正整数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 Beginner Contest 142题解

AtCoder 是一个非常好的选择,它提供了各种难度级别的题目,特别是适合初学者的AtCoder Beginner Contest。此外,CodeforcesLeetCode 也是非常流行的平台,它们提供了大量的题目和竞赛,可以帮助你不断提升算法能力。

系统学习算法和数据结构

算法和数据结构是解决算法竞赛题目的基础。你需要系统地学习常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划、贪心算法等)。建议通过阅读经典的算法书籍(如《算法导论》、《算法》)和参加在线课程来系统学习。

算法竞赛入门:AtCoder Beginner Contest 142题解

另外,理解不同算法的时间复杂度和空间复杂度对于优化代码至关重要。

多做练习,注重总结和反思

仅仅学习理论知识是不够的,你需要通过大量的练习来巩固所学知识。AtCoder Beginner Contest提供了一个很好的练习机会。每次完成比赛后,都要认真分析自己的解题思路,总结经验教训。对于没有解决的题目,要认真学习题解,理解正确的解题思路,并尝试自己实现代码。

算法竞赛入门:AtCoder Beginner Contest 142题解

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。无论选择哪个平台,都需要坚持练习,才能不断提升自己的算法能力。 同时,也需要注意,算法竞赛不仅仅是关于代码和算法,还需要具备一定的数学基础和逻辑思维能力。因此,在学习算法和数据结构的同时,也要注重提高自己的数学和逻辑思维能力。可以通过阅读数学书籍、参加数学竞赛等方式来提高数学能力。可以通过做一些逻辑推理题目、玩一些益智游戏等方式来提高逻辑思维能力。 总之,提高在算法竞赛中的表现需要系统的学习和练习,同时也要注重提高自己的数学和逻辑思维能力。希望本文能够帮助你更好地入门算法竞赛,并在算法学习的道路上越走越远。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

400

2023.08.14

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

0

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

22

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

2

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

40

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号