CF1838A-Blackboard-List

cf1838a,blackboard,list · 浏览次数 : 17

小编点评

```c++ #include 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) << '\'; } int main(void) { cin.tie(0)->sync_with_stdio(false); int T; cin >> T; while (T--) work(); return 0; } ```

正文

题意简述

在黑板上有两个数字,进行如下操作 \(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();
}

与CF1838A-Blackboard-List相似的内容: