题解
分数最高的同学
1 条题解
-
0
解题思路
有 n 位同学的姓名和 CSPJ 复赛得分,要输出得分最高的同学的姓名。如果好几个同学并列最高分,要输出最先输入的那一个。
做法:
- 用数组 name 存每位同学的姓名,数组 score 存每位同学的分数;
- 设 best 记录“目前最高分同学的下标”,一开始先假设第 1 个同学(best = 0);
- 从第 2 个同学开始往后看:只有当 score[i] 严格大于 score[best] 时才更新 best。用“严格大于”是为了保证并列最高分时,保留最先输入的那位同学;
- 最后输出 name[best]。
参考代码
// P4435 分数最高的同学:找出成绩最高的人,输出其姓名(同分取最先输入的那个) #include <iostream> using namespace std; char name[500][205]; // 保存每位同学的姓名,长度不超过 200 int score[500]; // 保存每位同学的分数 int main() { int n; // 学生人数 cin >> n; for (int i = 0; i < n; i++) { cin >> name[i] >> score[i]; // 读姓名和成绩 } int best = 0; // 记录最高分同学的下标,先假设第 1 个 for (int i = 1; i < n; i++) { // 只有"严格大于"才更新,保证同分时保留最先输入的那个 if (score[i] > score[best]) best = i; } cout << name[best] << endl; // 输出分数最高的同学姓名 return 0; }复杂度分析
- 每个同学都要比较一次分数,学生人数最多 500,时间复杂度是 O(n)。
- 需要存下所有同学的姓名和分数,空间复杂度是 O(n)(姓名长度最长 200)。
- 1