题解
分数查询程序
1 条题解
-
0
解题思路
这道题问的是"我的分数排第几名,有多少人跟我同分",而且有个特别的规则:同分数并列排名,并且占用名次。
什么意思呢?举个样例里的例子: 分数是
88 99 98 97 92 100 82 99 78 99,查询99。把分数从高到低排:
100, 99, 99, 99, 98, ...- 第一名是 100 分(只有1个人);
- 第二名到第四名都是 99 分(3个人并列第二,而且占了2、3、4三个名次)。
所以 99 分的排名是 2,同分人数是 3。
怎么用程序算呢?不用真的排序,只要两个统计:
- 排名 = 比 x 分数高的人数 + 1。因为比 x 高的人全排前面,x 自己就从下一个名次开始算。比 99 高的只有 100 这 1 个人,所以排名 = 1 + 1 = 2。✓
- 同分人数 = 和 x 分数一样的人数,数一数就有 3 个。✓
注意:读入顺序是"先读 n 个分数,再读要查的 x",所以要把分数先存进数组,再读 x 来比较。
参考代码
// P4476 分数查询程序:并列排名占用名次。查x的排名=高于x的人数+1,同分人数=与x相等的人数 #include <iostream> using namespace std; int main() { int n; cin >> n; int a[105]; // 存所有分数 for (int i = 0; i < n; i++) cin >> a[i]; int x; cin >> x; // 要查询的分数 int big = 0, same = 0; for (int i = 0; i < n; i++) { if (a[i] > x) big++; // 比x高的人数:决定排名 if (a[i] == x) same++; // 和x同分的人数 } cout << (big + 1) << ' ' << same << endl; // 排名 = 高于x的人数 + 1 return 0; }复杂度分析
- 时间:读入是 O(n),比较统计也是 O(n),总时间 O(n)。
- 空间:用数组存 n 个分数,是 O(n)。
- 1