
IO竞赛是培养和选拔优秀计算机人才的重要平台。2025年的IO竞赛在难度和题型上都有新的变化,为了帮助初学者更好地准备竞赛,本文将详细解析2025年入门级(难度系数1-3)的IO竞赛题目,包括解题思路、算法选择和代码实现。
学习路径: 入门 → 基础 → 提高 → 竞赛实战难度系数 | 适合阶段 | 考察重点 | 推荐学习时长 |
|---|---|---|---|
1-3 | 入门阶段 | 基础语法、简单算法 | 2-3个月 |
4-5 | 基础阶段 | 数据结构、基础算法 | 3-4个月 |
6-8 | 提高阶段 | 高级算法、综合应用 | 4-5个月 |
9-10 | 竞赛阶段 | 创新思维、难题攻克 | 长期 |
目录
├── 第一章:2025年IO竞赛入门级题目概述
├── 第二章:难度系数1题目解析(8题)
├── 第三章:难度系数2题目解析(8题)
├── 第四章:难度系数3题目解析(8题)
├── 第五章:入门级题目解题技巧总结
└── 第六章:从入门到基础的学习建议2025年IO竞赛入门级题目主要考察编程基础、简单算法和逻辑思维能力。题目难度适中,适合刚开始学习编程的学生。根据2025年NOI修订版大纲,入门级(CSP-J)的知识点难度系数为1-5,其中1-3为基础入门内容。
入门级题目类型分布:
基础语法 → 30%
简单算法 → 40%
逻辑推理 → 20%
数学应用 → 10%入门级题目的特点:
难度系数1的题目是IO竞赛中最简单的题目,主要考察基本的编程语法和简单的逻辑判断。以下是8道典型的难度系数1题目解析。
题目描述:编写一个程序,输出"Hello World"。
解题思路:这是最基础的编程题目,主要考察如何编写一个简单的程序并输出内容。
C++代码实现:
#include <iostream>
using namespace std;
int main() {
cout << "Hello World" << endl;
return 0;
}Python代码实现:
print("Hello World")题目描述:输入两个整数,输出它们的和。
解题思路:读取两个整数,计算它们的和,然后输出结果。
C++代码实现:
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}题目描述:输入一个整数,判断它是奇数还是偶数。
解题思路:使用取模运算符(%)判断一个数除以2的余数是否为0。
C++代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n % 2 == 0) {
cout << "偶数" << endl;
} else {
cout << "奇数" << endl;
}
return 0;
}题目描述:输入矩形的长和宽,计算并输出矩形的面积。
解题思路:读取长和宽,计算它们的乘积作为面积。
C++代码实现:
#include <iostream>
using namespace std;
int main() {
int length, width;
cin >> length >> width;
cout << length * width << endl;
return 0;
}题目描述:输入一个正整数n,输出从1到n的所有整数,每个数占一行。
解题思路:使用循环结构,从1迭代到n,依次输出每个数。
C++代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cout << i << endl;
}
return 0;
}题目描述:输入一个正整数n,计算并输出n的阶乘。
解题思路:使用循环计算从1到n的乘积。
C++代码实现:
#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;
}题目描述:输入一个小写字母,输出对应的大写字母;输入一个大写字母,输出对应的小写字母。
解题思路:利用ASCII码的性质进行字符转换。
C++代码实现:
#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;
}题目描述:输入三个整数,按从小到大的顺序输出。
解题思路:使用简单的比较和交换操作,将三个数排序后输出。
C++代码实现:
#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的题目比难度系数1的题目稍难,开始考察简单的算法思想和数据处理能力。以下是8道典型的难度系数2题目解析。
题目描述:输入n个整数,找出其中的最大值。
解题思路:初始化一个最小值,然后依次比较每个输入的数,更新最大值。
C++代码实现:
#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;
}题目描述:输入n个实数,计算它们的平均数。
解题思路:读取n个实数,累加求和,然后除以n得到平均数。
C++代码实现:
#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;
}题目描述:输入一个正整数n,判断它是否为素数。
解题思路:素数是只能被1和自身整除的数。可以通过检查从2到sqrt(n)的数是否能整除n来判断。
C++代码实现:
#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;
}题目描述:输出斐波那契数列的前n项。
解题思路:斐波那契数列的前两项是1,从第三项开始,每一项等于前两项之和。
C++代码实现:
#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;
}题目描述:输入一个字符串,将其逆序后输出。
解题思路:可以使用双指针法,从字符串的两端向中间移动,交换字符。
C++代码实现:
#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;
}题目描述:输入一个字符串,统计其中每个字符出现的次数。
解题思路:使用一个数组或字典来记录每个字符出现的次数。
C++代码实现:
#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;
}题目描述:输入两个正整数,计算它们的最大公约数。
解题思路:使用辗转相除法(欧几里得算法)计算最大公约数。
C++代码实现:
#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;
}题目描述:输入两个数和一个运算符(+、-、*、/),输出计算结果。
解题思路:根据输入的运算符,执行相应的运算。
C++代码实现:
#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的题目开始考察基本的数据结构和算法思想,需要一定的编程经验和逻辑思维能力。以下是8道典型的难度系数3题目解析。
题目描述:输入一个有序数组和一个目标值,使用二分查找算法找到目标值的位置。
解题思路:利用有序数组的特性,每次将查找范围缩小一半。
C++代码实现:
#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;
}题目描述:输入n个整数,使用冒泡排序或选择排序算法对它们进行排序。
解题思路:实现冒泡排序算法,通过重复比较相邻元素并交换它们的位置来排序。
C++代码实现:
#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;
}题目描述:输入一个数组,计算其前缀和数组。
解题思路:前缀和数组的每个元素表示原数组前i个元素的和。
C++代码实现:
#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;
}题目描述:输入一个正整数n,统计1到n中每个数字出现的次数。
解题思路:遍历1到n的每个数,统计每个数字的出现次数。
C++代码实现:
#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;
}题目描述:输入一个数组,找出和最大的连续子数组。
解题思路:使用动态规划的思想,记录当前的最大和。
C++代码实现:
#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;
}题目描述:输入一个字符串,判断它是否为回文串。
解题思路:从字符串的两端向中间比较字符是否相同。
C++代码实现:
#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;
}题目描述:输入一个表达式(只包含加减乘除和括号),计算其结果。
解题思路:使用栈来模拟计算器的计算过程。
C++代码实现:
#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;
}题目描述:模拟一个简单的银行账户系统,支持存款、取款和查询余额操作。
解题思路:使用一个变量来记录余额,根据输入的操作类型执行相应的操作。
C++代码实现:
#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竞赛入门级题目的解析,我们可以总结出以下解题技巧:
解题流程:审题 → 设计算法 → 编写代码 → 测试调试 → 优化代码对于想要在IO竞赛中取得好成绩的初学者,以下是一些学习建议:
学习资源推荐:
- 书籍:《算法竞赛入门经典》、《C++ Primer》
- 网站:OI Wiki、Codeforces、LeetCode
- 视频:各类算法教学视频IO竞赛入门级题目的难度适中,主要考察基本的编程能力和逻辑思维。通过系统的学习和练习,初学者可以逐步掌握解决这些题目的方法和技巧。希望本文的解析能够帮助读者在IO竞赛的道路上取得更好的成绩。
学习价值分布:
编程基础(40%) | 算法思想(30%) | 逻辑思维(20%) | 问题解决能力(10%)互动讨论: