题解:洛谷 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

【核心思想】

  1. 问题分析:有 \(n\) 名学员,每名学员有姓名、年龄和去年 NOIP 成绩(保证是 5 的倍数)。经过一年培训,年龄增加 1 岁,成绩提高 20%,但最高不超过 600 分。需要输出培训后的学员信息。本质是一个结构体存储与数据处理问题,按规则更新数据并输出。

  2. 算法选择

    • 结构体存储:定义结构体包含姓名、年龄、成绩。
    • 线性处理:读入数据后,对每条记录计算年龄 age+1,成绩 score * 1.2 后与 600 取较小值。
    • 复杂度:时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)
  3. 关键步骤

    • 读入:读取 \(n\) 和每个学生的信息。
    • 更新
      • 年龄加 1。
      • 成绩乘以 1.2(代码中使用 score += score * 0.2),若超过 600 则置为 600。
    • 输出:按格式输出。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\)
    • 空间复杂度:\(O(n)\)
  5. 结构体与数据处理

    • 浮点数运算:成绩乘以 1.2 可能产生浮点数,但 NOIP 成绩是整数,题目保证原始成绩是 5 的倍数,乘以 1.2 后可能不是整数,需注意类型转换(代码中使用 int 自动截断,但可能丢失精度)。更稳妥的是用整数运算:score = score * 6 / 5
    • 上限约束:成绩最高 600,用 min(score, 600) 处理。
    • 适用场景:这类“结构体+数据更新”问题,是结构体练习的常见形式。

【算法标签】

入门 #模拟

【代码详解】

#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
posted @ 2026-09-01 09:26  团爸讲算法  阅读(13)  评论(0)    收藏  举报