首页 > 其他分享 >CF1512D Corrupted Array 题解

CF1512D Corrupted Array 题解

时间:2023-05-19 14:45:09浏览次数:45  
标签:Corrupted int 题解 sum 元素 CF1512D 数组 Array

CF1512D Corrupted Array 题解

洛谷

Codeforces

Description

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

  • 随机生成一个含有 \(n\) 个元素的原始数组\(a\);
  • 把数组 \(a\) 赋值给数组 \(b\),即 \(b_i=a_i(1\le i\le n)\);
  • 数组 \(b\) 的第 \(n+1\) 个元素为数组 \(a\) 的元素和,即 \(b_{n+1}=\sum_{i=1}^na_i\);
  • 数组 \(b\) 的第 \(n+2\) 个元素是个随机整数 \(x(1\le x\le10^9)\);
  • 打乱 \(b\) 数组。

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

  • \(a=[2,2,3]\),且 \(x=12\);
  • \(a=[3,2,7]\),且 \(x=2\)。

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

Solution

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

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

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

  • 当 \(i = n + 2\) 时,\(sum - b_{n + 2} - b_{n + 1} = b_{n + 1}\) 时满足条件,此时输出 \(b_{1},\ldots,b_{n}\) 即可。

  • 否则当 \(sum - b_{n + 2} - b_{i} = b_{n + 2}\) 时满足条件,此时对于所有的 \((1 \leq k \leq n + 1)\) 且 \(k \ne i\) 输出 \(b_{k}\) 即可。

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

Codes

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define max_n 300010
void 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;
}

标签:Corrupted,int,题解,sum,元素,CF1512D,数组,Array
From: https://www.cnblogs.com/yuhang-ren/p/17415081.html

相关文章

  • QObject::connect: Cannot queue arguments of type 'QByteArray&' (Make sure 'QByte
    在写功能时,一次从子线程串口读取数据发回给主线程。使用信号槽,QByteArray作为参数,在linux开发板系统下一运行没有任何提示,也没数据。而测试一下使用QString作参数确可以触发槽函数,想不明白为什么,也没查到原因。不得已,只好把相关代码移植到windows下模拟一下慢慢调式。if......
  • 【题解】第五届图灵杯
    //createdon23.05.13目录A.差值B.基础循环结构练习题C.基础计算几何练习题D.永恒悲剧A.差值考虑求长度为\(i\)的答案,肯定是长度\(\geqi\)的后缀,按照字典序排序后,相邻两个求解。所以考虑倒着扫,每次对于\(i\)的后缀找到排名前后第一个后缀,求出两个长度为\(i\)......
  • GYM104363 2023 ccpc 黑龙江省赛 题解
    比赛链接:https://codeforces.com/gym/104363题解:B//bySkyRainWind#include<bits/stdc++.h>#definemprmake_pair#definedebug()cerr<<"Yoshino\n"#definepiipair<int,int>#definepbpush_backusingnamespacestd;typedeflong......
  • ASC8题解
    B:考虑用\(D(n,r)\)表示在\(r\)维空间中有\(n\)个超平面最多形成多少个区域,感觉不是很好做,考虑一下怎么递推。根据在二三维的经验,我们可以得到以下递推式:\(D(n,r)=D(n-1,r)+D(n-1,r-1)\),实际意义就是原来已经有了\(n-1\)个然后再加入一个之后,会与前面的\(n-1\)个超平面在\(r\)维......
  • Html中使用jquery通过Ajax请求WebService接口以及跨域问题解决
    场景VS2019新建WebService/Web服务/asmx并通过IIS实现发布和调用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130743584在上面实现发布WebService的基础上,怎样在html中通过jquery对接口发起请求和解析数据。注:博客:https://blog.csdn.net/badao_liumang_qiz......
  • abc269_f Numbered Checker 题解
    NumberedChecker题意有一个\(n\timesm\)的方格矩阵,左上角是\((1,1)\),右下角是\((n,m)\),每个方格中都有一个整数,其中\((x,y)\)中的数字为:如果\(x+y\)是奇数,则\((x,y)\)中的数字为\(0\)。否则,\((x,y)\)中的数字为\((x-1)\timesm+y\)。有\(Q\)组询问,每组......
  • Java数组最常用操作方法(Arrays类)
    最近在写代码的过程中发现我们很多地方都会处理数组,有时只是模糊的记得有API可以调用,每次都查文档很是费事儿,适当的总结希望提高开发速度一、申明数组数组的申明十分简单也十分的基础,注意第三种申明方式,[]里面是不带数字的String[]Array1=newString[5];String[]Arra......
  • CSP-J2022试题题解
    1.乘方原题:https://www.luogu.com.cn/problem/P8813代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintXN=1e9;lla,b,ans=1;intmain(){ cin>>a>>b; for(inti=1;i<=b;i++){ ans*=a; if(ans>XN){ cout......
  • abc270_f Transportation 题解
    Transportation题意有\(n\)个城市,你可以执行以下操作若干次:选择一个没有建机场的城市\(i\),花费\(x_i\)建一个机场。选择一个没有建港口的城市\(i\),花费\(y_i\)建一个港口。还有\(m\)条没有修建的道路,第\(i\)条道路双向连接\(a_i\)和\(b_i\),修建这条道路需要......
  • CF1077E Thematic Contests 题解
    ThematicContests题意有\(n\)个问题,每个问题有一个分类\(a_i\)。现在要举办一些比赛,要求:一场比赛中所有题目的分类相同。所有比赛的分类是互不相同的。第一场比赛的题目数量任意,但从第二场开始,每一场比赛的题目数量都必须是前一场的两倍。求所有比赛的题目数量之和的......