传送门:Advantage
赛时十分钟才写出来的简单模拟题……
题意分析
思路
求「最厉害的人比自己 蒻 多少」,因此我们只需要记录最强者的能力值,依次把每个人的能力值都减去它,就得到了答案。
但是,真的这么简单吗?
题目中特意强调了「除自己之外」,因此我们需要不仅需要记录最大值,还需要记录 次大值,此时我们就需要对这个数组从大到小排序,才能得到最大值和次大值。
变量及数据处理
对于本题,我们可以声明 s[]
、sn[]
、ans[]
三个数组,将输入得到的 s[]
数组复制一份得到 sn[]
数组,并对它从大到小排序(因为稍后计算答案时还需要用到 s[]
,所以不能直接操作)。
声明 maxn
和 secn
两个变量,分别用于存储 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;
}