CF1512D Corrupted Array 题解

洛谷


【资料图】

Codeforces

Description

给定一个正整数 \(n\) 和长度为 \(n+2\) 的数组 \(b\),数组 \(b\) 是依据如下算法构造的:

例如,数组 \(b=[2,3,7,12,2]\),那么它能够通过如下方式构建:

给定一个 \(b\) 数组,请你求出它对应的 \(a\) 数组。

Solution

假设打乱前的 \(b\) 数组为 \(c\),记所有数的和为 \(sum\)。

将 \(b\) 数组排序,为了满足数组 \(c\) 的第 \(n+1\) 个元素为数组 \(a\) 的元素和,和一定为最大的数或第二大的数(此时对应的随机数为最大的数)。

在排序后的 \(b\) 数组中枚举随机数,设当前位置为 \(i\)。

全部枚举仍无答案则无解。

Codes

#include using namespace std;#define int long long#define max_n 300010void read(int &p){    p = 0;    int k = 1;    char c = getchar();    while (c < "0" || c > "9")    {        if (c == "-")        {            k = -1;        }        c = getchar();    }    while (c >= "0" && c <= "9")    {        p = p * 10 + c - "0";        c = getchar();    }    p *= k;    return;}void write_(int x){    if (x < 0)    {        putchar("-");        x = -x;    }    if (x > 9)    {        write_(x / 10);    }    putchar(x % 10 + "0");}void writesp(int x){    write_(x);    putchar(" ");}void writeln(int x){    write_(x);    putchar("\n");}int T, n, nums[max_n];signed main(){#if _clang_    freopen("1.in", "r", stdin);    freopen("1.out", "w", stdout);#endif    read(T);    while (T--)    {        read(n);        int sum = 0;        for (int i = 1; i <= n + 2; i++)        {            read(nums[i]);            sum += nums[i];        }        sort(nums + 1, nums + n + 3);        if (sum - nums[n + 2] - nums[n + 1] == nums[n + 1] || sum - nums[n + 2] - nums[n + 1] == nums[n + 2])        {            for (int i = 1; i <= n; i++)            {                writesp(nums[i]);            }            puts("");            continue;        }        int ans = -1;        for (int i = 1; i <= n; i++)        {            if (sum - nums[n + 2] - nums[i] == nums[n + 2])            {                ans = i;                continue;            }        }        if (ans == -1)        {            puts("-1");            continue;        }        else        {            for (int i = 1; i <= n + 1; i++)            {                if (i == ans)                {                    continue;                }                writesp(nums[i]);            }            puts("");        }    }    return 0;}

推荐内容