首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >IO竞赛2025年题目解析:入门级难度(1-3)

IO竞赛2025年题目解析:入门级难度(1-3)

作者头像
安全风信子
发布2025-11-13 13:06:29
发布2025-11-13 13:06:29
1240
举报
文章被收录于专栏:AI SPPECHAI SPPECH

引言

IO竞赛是培养和选拔优秀计算机人才的重要平台。2025年的IO竞赛在难度和题型上都有新的变化,为了帮助初学者更好地准备竞赛,本文将详细解析2025年入门级(难度系数1-3)的IO竞赛题目,包括解题思路、算法选择和代码实现。

代码语言:javascript
复制
学习路径: 入门 → 基础 → 提高 → 竞赛实战

难度系数

适合阶段

考察重点

推荐学习时长

1-3

入门阶段

基础语法、简单算法

2-3个月

4-5

基础阶段

数据结构、基础算法

3-4个月

6-8

提高阶段

高级算法、综合应用

4-5个月

9-10

竞赛阶段

创新思维、难题攻克

长期

目录

代码语言:javascript
复制
目录
├── 第一章:2025年IO竞赛入门级题目概述
├── 第二章:难度系数1题目解析(8题)
├── 第三章:难度系数2题目解析(8题)
├── 第四章:难度系数3题目解析(8题)
├── 第五章:入门级题目解题技巧总结
└── 第六章:从入门到基础的学习建议

第一章:2025年IO竞赛入门级题目概述

2025年IO竞赛入门级题目主要考察编程基础、简单算法和逻辑思维能力。题目难度适中,适合刚开始学习编程的学生。根据2025年NOI修订版大纲,入门级(CSP-J)的知识点难度系数为1-5,其中1-3为基础入门内容。

代码语言:javascript
复制
入门级题目类型分布:
基础语法 → 30%
简单算法 → 40%
逻辑推理 → 20%
数学应用 → 10%

入门级题目的特点:

  • 题目描述清晰,容易理解
  • 数据规模较小,对算法效率要求不高
  • 主要考察基本编程能力和逻辑思维
  • 适合使用C++、Python等编程语言解决

第二章:难度系数1题目解析

难度系数1的题目是IO竞赛中最简单的题目,主要考察基本的编程语法和简单的逻辑判断。以下是8道典型的难度系数1题目解析。

2.1 题目1:输出Hello World

题目描述:编写一个程序,输出"Hello World"。

解题思路:这是最基础的编程题目,主要考察如何编写一个简单的程序并输出内容。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    cout << "Hello World" << endl;
    return 0;
}

Python代码实现

代码语言:javascript
复制
print("Hello World")
2.2 题目2:两个数的和

题目描述:输入两个整数,输出它们的和。

解题思路:读取两个整数,计算它们的和,然后输出结果。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    cout << a + b << endl;
    return 0;
}
2.3 题目3:判断奇偶数

题目描述:输入一个整数,判断它是奇数还是偶数。

解题思路:使用取模运算符(%)判断一个数除以2的余数是否为0。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    if (n % 2 == 0) {
        cout << "偶数" << endl;
    } else {
        cout << "奇数" << endl;
    }
    return 0;
}
2.4 题目4:计算矩形面积

题目描述:输入矩形的长和宽,计算并输出矩形的面积。

解题思路:读取长和宽,计算它们的乘积作为面积。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int length, width;
    cin >> length >> width;
    cout << length * width << endl;
    return 0;
}
2.5 题目5:输出1到n的整数

题目描述:输入一个正整数n,输出从1到n的所有整数,每个数占一行。

解题思路:使用循环结构,从1迭代到n,依次输出每个数。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cout << i << endl;
    }
    return 0;
}
2.6 题目6:计算阶乘

题目描述:输入一个正整数n,计算并输出n的阶乘。

解题思路:使用循环计算从1到n的乘积。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    long long factorial = 1;
    for (int i = 1; i <= n; i++) {
        factorial *= i;
    }
    cout << factorial << endl;
    return 0;
}
2.7 题目7:字符转换

题目描述:输入一个小写字母,输出对应的大写字母;输入一个大写字母,输出对应的小写字母。

解题思路:利用ASCII码的性质进行字符转换。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    char c;
    cin >> c;
    if (c >= 'a' && c <= 'z') {
        cout << (char)(c - 32) << endl;
    } else if (c >= 'A' && c <= 'Z') {
        cout << (char)(c + 32) << endl;
    }
    return 0;
}
2.8 题目8:简单排序

题目描述:输入三个整数,按从小到大的顺序输出。

解题思路:使用简单的比较和交换操作,将三个数排序后输出。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    // 冒泡排序的简单实现
    if (a > b) swap(a, b);
    if (a > c) swap(a, c);
    if (b > c) swap(b, c);
    cout << a << " " << b << " " << c << endl;
    return 0;
}

第三章:难度系数2题目解析

难度系数2的题目比难度系数1的题目稍难,开始考察简单的算法思想和数据处理能力。以下是8道典型的难度系数2题目解析。

3.1 题目1:求最大值

题目描述:输入n个整数,找出其中的最大值。

解题思路:初始化一个最小值,然后依次比较每个输入的数,更新最大值。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <climits>
using namespace std;

int main() {
    int n;
    cin >> n;
    int max_val = INT_MIN;
    for (int i = 0; i < n; i++) {
        int num;
        cin >> num;
        if (num > max_val) {
            max_val = num;
        }
    }
    cout << max_val << endl;
    return 0;
}
3.2 题目2:计算平均数

题目描述:输入n个实数,计算它们的平均数。

解题思路:读取n个实数,累加求和,然后除以n得到平均数。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    double sum = 0.0;
    for (int i = 0; i < n; i++) {
        double num;
        cin >> num;
        sum += num;
    }
    cout << sum / n << endl;
    return 0;
}
3.3 题目3:判断素数

题目描述:输入一个正整数n,判断它是否为素数。

解题思路:素数是只能被1和自身整除的数。可以通过检查从2到sqrt(n)的数是否能整除n来判断。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <cmath>
using namespace std;

bool is_prime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int n;
    cin >> n;
    if (is_prime(n)) {
        cout << "是素数" << endl;
    } else {
        cout << "不是素数" << endl;
    }
    return 0;
}
3.4 题目4:斐波那契数列

题目描述:输出斐波那契数列的前n项。

解题思路:斐波那契数列的前两项是1,从第三项开始,每一项等于前两项之和。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int a = 1, b = 1;
    cout << a << " " << b << " ";
    for (int i = 3; i <= n; i++) {
        int c = a + b;
        cout << c << " ";
        a = b;
        b = c;
    }
    cout << endl;
    return 0;
}
3.5 题目5:字符串逆序

题目描述:输入一个字符串,将其逆序后输出。

解题思路:可以使用双指针法,从字符串的两端向中间移动,交换字符。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;
    int left = 0, right = s.size() - 1;
    while (left < right) {
        swap(s[left], s[right]);
        left++;
        right--;
    }
    cout << s << endl;
    return 0;
}
3.6 题目6:统计字符出现次数

题目描述:输入一个字符串,统计其中每个字符出现的次数。

解题思路:使用一个数组或字典来记录每个字符出现的次数。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cin >> s;
    int count[256] = {0}; // 假设使用ASCII码
    for (char c : s) {
        count[(unsigned char)c]++;
    }
    for (int i = 0; i < 256; i++) {
        if (count[i] > 0) {
            cout << (char)i << ": " << count[i] << endl;
        }
    }
    return 0;
}
3.7 题目7:最大公约数

题目描述:输入两个正整数,计算它们的最大公约数。

解题思路:使用辗转相除法(欧几里得算法)计算最大公约数。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << gcd(a, b) << endl;
    return 0;
}
3.8 题目8:简单计算器

题目描述:输入两个数和一个运算符(+、-、*、/),输出计算结果。

解题思路:根据输入的运算符,执行相应的运算。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    double a, b;
    char op;
    cin >> a >> op >> b;
    switch (op) {
        case '+':
            cout << a + b << endl;
            break;
        case '-':
            cout << a - b << endl;
            break;
        case '*':
            cout << a * b << endl;
            break;
        case '/':
            if (b != 0) {
                cout << a / b << endl;
            } else {
                cout << "除数不能为零" << endl;
            }
            break;
        default:
            cout << "无效的运算符" << endl;
    }
    return 0;
}

第四章:难度系数3题目解析

难度系数3的题目开始考察基本的数据结构和算法思想,需要一定的编程经验和逻辑思维能力。以下是8道典型的难度系数3题目解析。

4.1 题目1:二分查找

题目描述:输入一个有序数组和一个目标值,使用二分查找算法找到目标值的位置。

解题思路:利用有序数组的特性,每次将查找范围缩小一半。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

int binary_search(const vector<int>& arr, int target) {
    int left = 0, right = arr.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1; // 未找到
}

int main() {
    int n, target;
    cin >> n >> target;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    int result = binary_search(arr, target);
    if (result != -1) {
        cout << "目标值在位置:" << result << endl;
    } else {
        cout << "未找到目标值" << endl;
    }
    return 0;
}
4.2 题目2:简单排序算法

题目描述:输入n个整数,使用冒泡排序或选择排序算法对它们进行排序。

解题思路:实现冒泡排序算法,通过重复比较相邻元素并交换它们的位置来排序。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

void bubble_sort(vector<int>& arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    bubble_sort(arr);
    for (int num : arr) {
        cout << num << " ";
    }
    cout << endl;
    return 0;
}
4.3 题目3:一维数组前缀和

题目描述:输入一个数组,计算其前缀和数组。

解题思路:前缀和数组的每个元素表示原数组前i个元素的和。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

vector<long long> prefix_sum(const vector<int>& arr) {
    int n = arr.size();
    vector<long long> pre_sum(n + 1, 0);
    for (int i = 0; i < n; i++) {
        pre_sum[i + 1] = pre_sum[i] + arr[i];
    }
    return pre_sum;
}

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    vector<long long> pre_sum = prefix_sum(arr);
    for (int i = 1; i <= n; i++) {
        cout << pre_sum[i] << " ";
    }
    cout << endl;
    return 0;
}
4.4 题目4:统计数字出现次数

题目描述:输入一个正整数n,统计1到n中每个数字出现的次数。

解题思路:遍历1到n的每个数,统计每个数字的出现次数。

C++代码实现

代码语言:javascript
复制
#include <iostream>
using namespace std;

void count_digits(int n) {
    int count[10] = {0};
    for (int i = 1; i <= n; i++) {
        int num = i;
        while (num > 0) {
            int digit = num % 10;
            count[digit]++;
            num /= 10;
        }
    }
    for (int i = 0; i < 10; i++) {
        cout << i << "出现的次数:" << count[i] << endl;
    }
}

int main() {
    int n;
    cin >> n;
    count_digits(n);
    return 0;
}
4.5 题目5:最大子数组和

题目描述:输入一个数组,找出和最大的连续子数组。

解题思路:使用动态规划的思想,记录当前的最大和。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <climits>
using namespace std;

int max_subarray_sum(const vector<int>& arr) {
    int max_sum = INT_MIN;
    int current_sum = 0;
    for (int num : arr) {
        current_sum = max(num, current_sum + num);
        max_sum = max(max_sum, current_sum);
    }
    return max_sum;
}

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    cout << "最大子数组和:" << max_subarray_sum(arr) << endl;
    return 0;
}
4.6 题目6:简单的回文判断

题目描述:输入一个字符串,判断它是否为回文串。

解题思路:从字符串的两端向中间比较字符是否相同。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

bool is_palindrome(string s) {
    // 预处理:转为小写并移除非字母数字字符
    string filtered;
    for (char c : s) {
        if (isalnum(c)) {
            filtered += tolower(c);
        }
    }
    
    int left = 0, right = filtered.size() - 1;
    while (left < right) {
        if (filtered[left] != filtered[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

int main() {
    string s;
    getline(cin, s);
    if (is_palindrome(s)) {
        cout << "是回文串" << endl;
    } else {
        cout << "不是回文串" << endl;
    }
    return 0;
}
4.7 题目7:模拟计算器

题目描述:输入一个表达式(只包含加减乘除和括号),计算其结果。

解题思路:使用栈来模拟计算器的计算过程。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <stack>
#include <string>
using namespace std;

int calculate(string s) {
    stack<int> nums;
    stack<char> ops;
    int num = 0;
    char sign = '+';
    
    for (int i = 0; i < s.size(); i++) {
        char c = s[i];
        if (isdigit(c)) {
            num = num * 10 + (c - '0');
        }
        if ((!isdigit(c) && c != ' ') || i == s.size() - 1) {
            if (c == '(') {
                ops.push(sign);
                sign = '+';
            } else if (c == ')') {
                // 处理括号内的结果
                while (ops.top() != '(') {
                    char op = ops.top();
                    ops.pop();
                    int prev = nums.top();
                    nums.pop();
                    if (op == '+') nums.push(prev + num);
                    else if (op == '-') nums.push(prev - num);
                    else if (op == '*') nums.push(prev * num);
                    else if (op == '/') nums.push(prev / num);
                    num = nums.top();
                    nums.pop();
                }
                ops.pop(); // 弹出'('
            } else {
                // 处理当前的符号和数字
                if (sign == '+') nums.push(num);
                else if (sign == '-') nums.push(-num);
                else if (sign == '*') {
                    int prev = nums.top();
                    nums.pop();
                    nums.push(prev * num);
                } else if (sign == '/') {
                    int prev = nums.top();
                    nums.pop();
                    nums.push(prev / num);
                }
                sign = c;
                num = 0;
            }
        }
    }
    
    int result = 0;
    while (!nums.empty()) {
        result += nums.top();
        nums.pop();
    }
    return result;
}

int main() {
    string s;
    getline(cin, s);
    cout << calculate(s) << endl;
    return 0;
}
4.8 题目8:简单的模拟题

题目描述:模拟一个简单的银行账户系统,支持存款、取款和查询余额操作。

解题思路:使用一个变量来记录余额,根据输入的操作类型执行相应的操作。

C++代码实现

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    double balance = 0.0;
    int n;
    cin >> n;
    cin.ignore(); // 忽略换行符
    
    for (int i = 0; i < n; i++) {
        string op;
        double amount;
        cin >> op;
        if (op == "deposit" || op == "withdraw") {
            cin >> amount;
        }
        
        if (op == "deposit") {
            balance += amount;
            cout << "Deposit successful. Current balance: " << balance << endl;
        } else if (op == "withdraw") {
            if (amount > balance) {
                cout << "Insufficient funds" << endl;
            } else {
                balance -= amount;
                cout << "Withdrawal successful. Current balance: " << balance << endl;
            }
        } else if (op == "balance") {
            cout << "Current balance: " << balance << endl;
        } else {
            cout << "Invalid operation" << endl;
        }
    }
    
    return 0;
}

第五章:入门级题目解题技巧总结

通过对2025年IO竞赛入门级题目的解析,我们可以总结出以下解题技巧:

  1. 仔细审题:理解题目要求是解决问题的第一步,特别是要注意输入输出格式和边界条件。
  2. 选择合适的算法:对于入门级题目,通常可以使用简单的算法来解决,如枚举、贪心、简单的动态规划等。
  3. 优化代码结构:保持代码的清晰和可读性,使用有意义的变量名和函数名,添加必要的注释。
  4. 注意数据范围:选择合适的数据类型,避免溢出问题。例如,使用long long类型来存储较大的数值。
  5. 处理边界条件:考虑特殊情况,如输入为0、空字符串等情况。
  6. 测试调试:编写代码后,使用样例输入进行测试,确保代码的正确性。
代码语言:javascript
复制
解题流程:审题 → 设计算法 → 编写代码 → 测试调试 → 优化代码

第六章:从入门到基础的学习建议

对于想要在IO竞赛中取得好成绩的初学者,以下是一些学习建议:

  1. 打好基础:熟练掌握至少一门编程语言(如C++或Python)的语法和基本数据结构。
  2. 循序渐进:从简单的题目开始,逐步提高难度,不要急于求成。
  3. 多做练习:通过做题来巩固所学的知识和提高编程能力。可以在各大在线编程平台上寻找适合自己水平的题目。
  4. 学习算法:系统地学习各种算法,如排序、搜索、动态规划等,并理解它们的适用场景和时间复杂度。
  5. 阅读优秀代码:学习其他选手的代码,了解不同的解题思路和编程风格。
  6. 总结经验:每次做题后,总结解题经验和教训,避免在以后的比赛中犯同样的错误。
代码语言:javascript
复制
学习资源推荐:
- 书籍:《算法竞赛入门经典》、《C++ Primer》
- 网站:OI Wiki、Codeforces、LeetCode
- 视频:各类算法教学视频

结论

IO竞赛入门级题目的难度适中,主要考察基本的编程能力和逻辑思维。通过系统的学习和练习,初学者可以逐步掌握解决这些题目的方法和技巧。希望本文的解析能够帮助读者在IO竞赛的道路上取得更好的成绩。

学习价值分布:

代码语言:javascript
复制
编程基础(40%) | 算法思想(30%) | 逻辑思维(20%) | 问题解决能力(10%)

互动讨论:

  1. 你在学习IO竞赛的过程中遇到过哪些困难?是如何克服的?
  2. 对于IO竞赛的初学者,你有什么建议?
  3. 你认为IO竞赛中最重要的能力是什么?为什么?

参考资料

  1. 《算法竞赛入门经典》- 刘汝佳
  2. 《C++ Primer》- Stanley B. Lippman等
  3. OI Wiki - https://oi-wiki.org/
  4. Codeforces - https://codeforces.com/
  5. LeetCode - https://leetcode.com/
  6. 2025年NOI竞赛大纲
  7. 《数据结构与算法分析》- Mark Allen Weiss
  8. 《计算机程序设计艺术》- Donald E. Knuth
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 目录
  • 第一章:2025年IO竞赛入门级题目概述
  • 第二章:难度系数1题目解析
    • 2.1 题目1:输出Hello World
    • 2.2 题目2:两个数的和
    • 2.3 题目3:判断奇偶数
    • 2.4 题目4:计算矩形面积
    • 2.5 题目5:输出1到n的整数
    • 2.6 题目6:计算阶乘
    • 2.7 题目7:字符转换
    • 2.8 题目8:简单排序
  • 第三章:难度系数2题目解析
    • 3.1 题目1:求最大值
    • 3.2 题目2:计算平均数
    • 3.3 题目3:判断素数
    • 3.4 题目4:斐波那契数列
    • 3.5 题目5:字符串逆序
    • 3.6 题目6:统计字符出现次数
    • 3.7 题目7:最大公约数
    • 3.8 题目8:简单计算器
  • 第四章:难度系数3题目解析
    • 4.1 题目1:二分查找
    • 4.2 题目2:简单排序算法
    • 4.3 题目3:一维数组前缀和
    • 4.4 题目4:统计数字出现次数
    • 4.5 题目5:最大子数组和
    • 4.6 题目6:简单的回文判断
    • 4.7 题目7:模拟计算器
    • 4.8 题目8:简单的模拟题
  • 第五章:入门级题目解题技巧总结
  • 第六章:从入门到基础的学习建议
  • 结论
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档