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;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/csxaxx/p/13391102.html