top1编程
← 返回题目
题解

培训

1 条题解

  • 0
    @ 2026-8-5 21:47:33

    P4614 培训(入门)

    解题思路

    这道题描述的是 TCTM 学员参加一年培训后的变化:年龄长一岁,CSP 成绩提升 100 分,而且成绩不能超过满分 400 分。我们要做的就是把每个学员的姓名、年龄、成绩读进来,按照这个规则算出新年龄和新成绩,再输出。

    用一个结构体 Student 保存学员的姓名、年龄和培训前的成绩。姓名是字符串,用 char 数组来存。读入后用两条规则处理:年龄直接加一;成绩先加 100,然后判断一下,如果超过 400 就改成 400,这就像游戏里的"等级上限",封顶是 400 分。

    要注意三点。第一,学员人数没有明确上限,实际测试数据里 n 可能达到 5000,所以结构体数组要开得足够大(这里开 5005),否则数组越界会导致"段错误"(运行时错误)。第二,为了保险,把结构体数组放在 main 函数外面定义为全局变量,这样它占用的是"全局数据区",而不是容易不够用的"栈空间",程序更不容易崩溃。第三,姓名虽然看起来不长,但 char name[105] 已经足够容纳。

    以样例为例:lili 原来 9 岁、10 分,培训后变成 10 岁、110 分;lala 原来 12 岁、360 分,加 100 变成 460 分,超过 400 封顶成 400 分,所以输出 13 岁、400 分。输出时姓名和两个整数之间用空格隔开。

    参考代码

    // 培训:输出学员培训一年后的姓名、年龄和成绩
    #include <iostream>
    using namespace std;
    
    // 保存一名学员的信息
    struct Student {
        char name[105];   // 姓名
        int age;          // 年龄
        int score;        // 培训前的 CSP 成绩
    };
    
    // 全局数组(静态存储),避免栈空间不足;n 最大可达 5000
    Student a[5005];
    
    int main() {
        int n;
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> a[i].name >> a[i].age >> a[i].score;
            a[i].age++;            // 培训一年,年龄 +1
            a[i].score += 100;     // 成绩提升 100 分
            if (a[i].score > 400) a[i].score = 400;  // 不超过满分 400
        }
        for (int i = 0; i < n; i++) {
            cout << a[i].name << ' ' << a[i].age << ' ' << a[i].score << endl;
        }
        return 0;
    }
    

    复杂度分析

    程序把每个学员都处理了一遍,时间复杂度是 O(n),n 是学员人数。结构体数组的大小固定,空间复杂度是 O(n)。n 最大 5000,运行起来非常快。

    • 1