洛谷-P8841 题解

题目传送门

这道题主要考察的是 “打擂台” 算法,

也就是求最大或求最小值……

就像这样:

1
if (x > maxn) maxn = x;

也可以写成这样:

1
maxn = max(maxn, x);

最小值同理。

然而光求出最大最小值还不行,还必须求出每个人更新后的得分,计算方法题目已经给我们了,如下:

100×aiaminamaxamin100 \times \frac{a_i-a_{min}}{a_{max}-a_{min}}

最后注意一个点,题目原文说:

由于成绩系统的问题,最终录入的成绩只能是整数,采用直接去掉小数部分的方法

所以最后直接强转成 int 即可。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int main() {
int n;
double a_max = -1e9, a_min = 1e9; // 分别代表最大值与最小值,也要注意是 double 类型,否则计算结果是整数。
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] > a_max) a_max = a[i]; // 求最大值。
if (a[i] < a_min) a_min = a[i]; // 求最小值。
}
for (int i = 1; i <= n; i++) cout << (int)(100 * ((a[i] - a_min) / (a_max - a_min))) << " "; // 直接套公式,注意强转 int 。
return 0; // 最后收尾。
}

总结:

易错点只有最后要强转成 int 一个,其他的并不需要特别注意。