CF1838A-Blackboard-List
题意简述
在黑板上有两个数字,进行如下操作 \(n-2\) 次:
- 每次在黑板上选择任意两个数,将两个数的差的绝对值写在黑板上。
这样你会得到一个长度为 \(n (3 \le n \le 100)\) 的序列。
一共 \(t (1 \le t \le 100)\) 组数据。
每组数据给定操作后的序列,需要你还原出最初写在黑板上的两个数。
虽然可能有多个答案,不过,你只需要输出其中任意一个可能中的一个数即可。
题解
简单题,分类讨论即可:
- 存在负数:由于后面写下的都是差的绝对值,不可能凑出负数,所以负数一定是最初的两个数之一。
- 不存在负数:很明显,两个正数的差的绝对值一定小于大的数的绝对值。也就是 \(a > b > 0 \implies |a - b| = a - b < a\)。所以最大的那个数一定是最初的两个数之一。
于是代码就很好写了:
#include <iostream>
using namespace std;
void work(void) {
int n; cin >> n;
int mx = -0x7FFFFFFF, mn = 0x7FFFFFFF;
for (int x, i = 0; i < n; ++i) {
cin >> x;
if (x > mx) mx = x;
if (x < mn) mn = x;
}
cout << (mn < 0 ? mn : mx) << '\n';
}
int main(void) {
cin.tie(0)->sync_with_stdio(false);
int T; cin >> T;
while (T--) work();
}