top1编程
← 返回题目
题解

分数查询程序

1 条题解

  • 0
    @ 2026-8-5 1:08:04

    解题思路

    这道题问的是"我的分数排第几名,有多少人跟我同分",而且有个特别的规则:同分数并列排名,并且占用名次。

    什么意思呢?举个样例里的例子: 分数是 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。

    怎么用程序算呢?不用真的排序,只要两个统计:

    1. 排名 = 比 x 分数高的人数 + 1。因为比 x 高的人全排前面,x 自己就从下一个名次开始算。比 99 高的只有 100 这 1 个人,所以排名 = 1 + 1 = 2。✓
    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