题解
【入门】遥控飞机争夺赛
1 条题解
-
0
解题思路
每位选手飞 5 次,去掉一次最高分、一次最低分,剩下 3 次求平均作为最终成绩,然后按成绩排出前三名。
思路:
- 算每位选手的最终成绩:把 5 次成绩排序,去掉第一个(最小)和最后一个(最大),中间 3 个求平均
- 按成绩从高到低排序:成绩高的是冠军
- 输出前三名:冠军、亚军、季军,成绩保留 3 位小数
为什么要排序 5 次成绩? 排好序后最小的一定在第一个、最大的一定在最后一个,直接去掉两端,剩下的就是中间的 3 个,很方便。
怎么算平均分? 中间 3 个的和除以 3,要注意用 3.0(小数)做除法,否则整数除法会丢小数。
举例:选手 23 的成绩 65 64 63 62 62
- 排序后 62 62 63 64 65
- 去掉 62 和 65,中间是 62 63 64
- 平均 (62+63+64)÷3 = 63
参考代码
#include <iostream> #include <iomanip> using namespace std; int id[105]; double score[105]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { int s[5]; cin >> id[i]; for (int j = 0; j < 5; j++) cin >> s[j]; // 5 次成绩排序 for (int j = 0; j < 5; j++) { for (int k = 0; k < 4 - j; k++) { if (s[k] > s[k + 1]) { int t = s[k]; s[k] = s[k + 1]; s[k + 1] = t; } } } // 去掉最大最小,中间三个平均 score[i] = (s[1] + s[2] + s[3]) / 3.0; } // 按成绩从高到低排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (score[j] < score[j + 1]) { double t = score[j]; score[j] = score[j + 1]; score[j + 1] = t; int k = id[j]; id[j] = id[j + 1]; id[j + 1] = k; } } } cout << fixed << setprecision(3); for (int i = 0; i < 3; i++) { cout << id[i] << " " << score[i] << endl; } return 0; }复杂度分析
- 时间复杂度:O(N²),排序选手
- 空间复杂度:O(N),存编号和成绩
- 1