题解
【基础】仰卧起坐成绩统计
1 条题解
-
0
解题思路
题目要求统计每个成绩区间的人数,然后按人数从多到少输出,人数一样时成绩好的先输出。
成绩区间:
- 大于等于 60:A
- 50~59:B
- 40~49:C
- 30~39:D
- 20~29:E
- 小于 20:F
思路:
- 用一个数组 cnt 统计 A~F 各区间人数
- 排序:按人数降序
- 注意:人数一样时,成绩好的(等级靠前的)先输出,所以排序要稳定(相等的元素保持原顺序)
为什么用稳定排序? 如果人数相同(比如 E 和 F 都是 3 人),要求成绩好的 E 先输出。稳定排序不会交换相等的元素,所以 A~F 的顺序保持下来,等级高的自然在前。
举例:10 个同学成绩统计后:
- A:0 B:1 C:2 D:1 E:3 F:3
- 按人数降序:E:3 F:3 C:2 B:1 D:1 A:0(E 和 F 同人数,E 在前)
参考代码
#include <iostream> using namespace std; int main() { int n, cnt[6] = {0}; char g[6] = {'A', 'B', 'C', 'D', 'E', 'F'}; cin >> n; for (int i = 0; i < n; i++) { int x; cin >> x; if (x >= 60) cnt[0]++; else if (x >= 50) cnt[1]++; else if (x >= 40) cnt[2]++; else if (x >= 30) cnt[3]++; else if (x >= 20) cnt[4]++; else cnt[5]++; } // 冒泡排序(稳定),人数降序,同人数保持 A~F 顺序 for (int i = 0; i < 6; i++) { for (int j = 0; j < 5 - i; j++) { if (cnt[j] < cnt[j + 1]) { int t = cnt[j]; cnt[j] = cnt[j + 1]; cnt[j + 1] = t; char c = g[j]; g[j] = g[j + 1]; g[j + 1] = c; } } } for (int i = 0; i < 6; i++) { cout << g[i] << ":" << cnt[i] << endl; } return 0; }复杂度分析
- 时间复杂度:O(N),统计加排序(6 个区间固定)
- 空间复杂度:O(1)
- 1