题目地址
https://codeforces.com/problemset/problem/1838/A
题目抽象
数组
a
a
a 中有
2
2
2 个数字,然后任取数组
a
a
a 中的两个数字
a
i
,
a
j
a_i, a_j
ai,aj,将
∣
a
i
−
a
j
∣
|a_i - a_j|
∣ai−aj∣ 放入数组
a
a
a,重复
n
−
2
n-2
n−2 次后形成长度为
n
n
n 的数组
现在给你乱序后的数组
a
a
a,要求把最初的其中一个数字
数据范围
3
≤
n
≤
100
3\le n\le100
3≤n≤100
−
1
0
9
≤
a
i
≤
1
0
9
-10^9\le a_i \le 10^9
−109≤ai≤109
题目类型
思维
解题思路
我们观察到数字有负数,而后续往里添加的数字都是非负数,也就是负数不可能生成
所以,如果
a
i
a_i
ai 是负数,那么一定是最初的数字
再来看所有
a
i
a_i
ai 都是非负数的情况,根据
∣
a
i
−
a
j
∣
≤
max
(
a
i
,
a
j
)
|a_i-a_j|\le \max(ai, aj)
∣ai−aj∣≤max(ai,aj),得到的新数一定是比原来的数要小的,所以最大的数一定是最初的数字
所以解法就非常简单了,最小的数字是负数,则输出最小数字,否则输出最大数字,
O
(
n
)
O(n)
O(n) 复杂度
由于
n
n
n 不大,直接排序
O
(
n
⋅
log
n
)
O(n \cdot \log n)
O(n⋅logn),写起来更方便
代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a[100];
void solve() {
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> a[i];
}
sort(a, a + n);
if (a[0] >= 0) {
cout << a[n - 1] << endl;
} else {
cout << a[0] << endl;
}
}
int main() {
int T; cin >> T; while (T--) solve();
}