传送门:Advantage

赛时十分钟才写出来的简单模拟题……

题意分析

思路

求「最厉害的人比自己 多少」,因此我们只需要记录最强者的能力值,依次把每个人的能力值都减去它,就得到了答案。

但是,真的这么简单吗?

题目中特意强调了「除自己之外」,因此我们需要不仅需要记录最大值,还需要记录 次大值,此时我们就需要对这个数组从大到小排序,才能得到最大值和次大值。

变量及数据处理

对于本题,我们可以声明 s[]sn[]ans[] 三个数组,将输入得到的 s[] 数组复制一份得到 sn[] 数组,并对它从大到小排序(因为稍后计算答案时还需要用到 s[],所以不能直接操作)。

声明 maxnsecn 两个变量,分别用于存储 s[] 的最大值和次大值,也就是 sn[1]sn[2](假定数组下标从 $1$ 开始)。

此时我们再遍历一次 s[] 数组,将不等于 maxn 的数都减去 maxn,等于 maxn 的数减去 secn,输出即可。

代码实现

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 200010;
int t, n, s[N], sn[N], ans[N], maxn, secn;

// 从大到小排序
inline bool cmp(int x, int y) {
    return x > y;
}

// 快读
inline int read() {
    int x = 0;
    char c = getchar();
    while (c < '0' || c > '9')
        c = getchar();
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    } return x;
}

int main() {
    t = read();
    while (t--) {
        n = read();
        // 读入并复制
        for (int i = 1; i <= n; ++i) {
            s[i] = read();
            sn[i] = s[i];
        } // 排序 获取最大值和次大值
        sort(sn + 1, sn + n + 1, cmp);
        maxn = sn[1], secn = sn[2];
        // 计算
        for (int i = 1; i <= n; ++i) {
            if (s[i] == maxn) ans[i] = s[i] - secn;
            else ans[i] = s[i] - maxn;
        } for (int i = 1; i <= n; ++i)
            printf("%d ", ans[i]);
        printf("\n");
    } return 0;
}
最后修改:2024 年 02 月 02 日
如果觉得我的文章对你有用,请随意赞赏