题解
培训
1 条题解
-
0
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