• Easy Construction


    这是牛客2020暑期多校第六场的E题

    题目大意是给我们n长的1-n的序列,让我们构造使得这个序列任意长度sum都存在,长度为sum的序列和取余n为k;

    粗看题目大意感觉是道难题,但是分析一下可以得到以下结论:

    (1)如果n为奇数,那么长度为n的总和为(n+1)*n/2,那么取余n,必定为0。这就是说n为奇数,k为0;

    (2)如果n为偶数,那么长度为n的总和为(n+1)*n/2,那么取余n,必定为n/2。这就是说n为偶数,k为n/2;

    接着如果都满足条件,那么我们就要开始构造这个序列让他满足我们的需求:

    (1)首先开始构造奇数,奇数情况下,k为0,那么我们保证第一位是n,就确保了长度sum=1时有效,然后我们把

    剩下的数两两凑对,i=1和n-i凑一对,那么sum=2是就满足条件,3的时候就是加上第一位,然后凑上i=2和n-i,和i=1与n-i,

    这样就满足4位,同理......就构造完成

    (2)偶数情况下,k=n/2,那我们的核心就是围绕n/2 ,然后剩下的两两凑对构成n,和奇数一样即可,唯一的问题是n这个数

    的位置要怎么办,我们把它放到第一位,这样方便我们凑sum=2,也不影响sum=3,因为我们的3是要保证n/2和i=1与n-1相结合

    所以把n放到第一位即可构造成功。

    然后附上代码:

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #define ll long long
    using namespace std;
    
    
    int main()
    {
        int n, k;
        cin >> n >> k;
        if (n % 2 == 1)
        {
            if (k != 0)
            {
                cout << "-1" << endl;
            }
            else
            {
                cout << n << " ";
                for (int i = 1; i <= n / 2; i++)
                {
                    cout<<" " << i << " " << n - i;
                }
            }
        }
        else
        {
            if (k != n / 2)
            {
                cout << "-1" << endl;
            }
            else
            {
                cout << n << " " << k;
                for (int i = 1; i < n / 2; i++)
                {
                    cout << " " << i << " " << n - i;
                }
            }
        }
    }
  • 相关阅读:
    MapReduce程序遇见java.net.UnknownHostException
    吐槽下《Hadoop权威指南(第二版)》的翻译
    HFileOutputFormat与TotalOrderPartitioner
    关于hive multi group by的疑惑
    Hive解决 java.io.IOException:SerDeException:LazySimpleSerDe
    一个字符编码引发的血案
    CSS颜色代码大全
    C#中ParameterizedThreadStart和ThreadStart区别
    Sql Server REPLACE函数的使用
    QueryString的用法
  • 原文地址:https://www.cnblogs.com/csxaxx/p/13391102.html
Copyright © 2020-2023  润新知