题解:洛谷 P5744 培训
【题目来源】
洛谷:P5744 【深基7.习9】培训 - 洛谷(luogu.com.cn)
【题目描述】
某培训机构的学员有如下信息:
- 姓名(字符串)
- 年龄(周岁,整数)
- 去年 NOIP 成绩(整数,且保证是 \(5\) 的倍数)
经过为期一年的培训,所有同学的成绩都有所提高,提升了 \(20\%\)(当然 NOIP 满分是 \(600\) 分,不能超过这个得分)。
输入学员信息,请设计一个结构体储存这些学生信息,并设计一个函数模拟培训过程,其参数是这样的结构体类型,返回同样的结构体类型,并输出学员信息。
【输入】
第一行输入一个正整数 \(n\),表示学员个数。
第二行开始往下 \(n\) 行。每行首先是一个字符串表示学员姓名,再是一个整数表示学员年龄,再是一个整数为去年 NOIP 成绩。
【输出】
输出 \(n\) 行,每行首先输出一个字符串表示学生姓名,再往后两个整数,表示经过一年的培训后学员的年龄和他们今年的 NOIP 成绩。以空格隔开。
【输入样例】
3
kkksc03 24 0
chen_zhe 14 400
nzhtl1477 18 590
【输出样例】
kkksc03 25 0
chen_zhe 15 480
nzhtl1477 19 600
【核心思想】
-
问题分析:有 \(n\) 名学员,每名学员有姓名、年龄和去年 NOIP 成绩(保证是 5 的倍数)。经过一年培训,年龄增加 1 岁,成绩提高 20%,但最高不超过 600 分。需要输出培训后的学员信息。本质是一个结构体存储与数据处理问题,按规则更新数据并输出。
-
算法选择:
- 结构体存储:定义结构体包含姓名、年龄、成绩。
- 线性处理:读入数据后,对每条记录计算年龄
age+1,成绩score * 1.2后与 600 取较小值。 - 复杂度:时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
-
关键步骤:
- 读入:读取 \(n\) 和每个学生的信息。
- 更新:
- 年龄加 1。
- 成绩乘以 1.2(代码中使用
score += score * 0.2),若超过 600 则置为 600。
- 输出:按格式输出。
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\)。
- 空间复杂度:\(O(n)\)。
-
结构体与数据处理:
- 浮点数运算:成绩乘以 1.2 可能产生浮点数,但 NOIP 成绩是整数,题目保证原始成绩是 5 的倍数,乘以 1.2 后可能不是整数,需注意类型转换(代码中使用
int自动截断,但可能丢失精度)。更稳妥的是用整数运算:score = score * 6 / 5。 - 上限约束:成绩最高 600,用
min(score, 600)处理。 - 适用场景:这类“结构体+数据更新”问题,是结构体练习的常见形式。
- 浮点数运算:成绩乘以 1.2 可能产生浮点数,但 NOIP 成绩是整数,题目保证原始成绩是 5 的倍数,乘以 1.2 后可能不是整数,需注意类型转换(代码中使用
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
// 定义学生结构体
struct student
{
string name; // 学生姓名
int age; // 学生年龄
int cj; // 学生成绩
};
int main()
{
student s[1005]; // 定义学生数组,最多存储1005个学生
int n; // 定义变量:学生数量
cin >> n; // 输入学生数量
// 输入每个学生的信息
for (int i = 1; i <= n; i++)
{
cin >> s[i].name >> s[i].age >> s[i].cj; // 输入姓名、年龄和成绩
}
// 处理每个学生的数据并输出结果
for (int i = 1; i <= n; i++)
{
s[i].cj += s[i].cj * 0.2; // 成绩增加20%
// 成绩上限为600分
if (s[i].cj > 600)
{
s[i].cj = 600;
}
// 输出处理后的学生信息(年龄+1,调整后的成绩)
cout << s[i].name << " " << s[i].age + 1 << " " << s[i].cj << endl;
}
return 0; // 程序正常结束
}
【运行结果】
3
kkksc03 24 0
chen_zhe 14 400
nzhtl1477 18 590
kkksc03 25 0
chen_zhe 15 480
nzhtl1477 19 600
浙公网安备 33010602011771号