zoukankan      html  css  js  c++  java
  • 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;
                }
            }
        }
    }
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/csxaxx/p/13391102.html
Copyright © 2011-2022 走看看