2020牛客暑期多校训练营(第六场)E.Easy Construction(思维构造,附图解)

地址:https://ac.nowcoder.com/acm/contest/5671/E

题意:

构造一个只含1~n的序列,使得对于每一个长度在[1,n]的i,序列都存在一段长度为i的连续子序列,它的和%n==k

解析:

正着看不好看,来倒着分析

首先是i==n的情况,也就是序列总和,如果它%n!=k,那肯定是不行的。

接下来就是一个猜测的过程了:

i固定时,尽量把sum弄大,防止小的sum凑不出来,这个也是根据画了好几种得出的,所以一定要勤动手啊。

所以就盲猜了一下构造方式,1,n-1,2,n-2.....直到把所有数填上,但是n奇偶不同,构造的过程在末尾有些不同。所以分开讨论即可。

而且根据图,n这个数字是一定要在两端的。

#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<string.h>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=5e5+10;
int a[maxn];
int vis[5005];
string s;
int main()
{
//    memset(vis,0,sizeof(vis));
    int n,k;
    cin>>n>>k;
    if(n==1)
    {
        cout<<"1"<<endl;return 0;
    }
    ll sum=(ll)(n*n+n)/2;
    if(sum%n!=k)
    {
        cout<<"-1"<<endl;return 0;
    }
    if(n%2==0)
    {
        for(int i=1;i<n/2;i++)
            cout<<i<<" "<<n-i<<" ";
        cout<<n/2<<" "<<n<<endl;
    }
    else
    {
        for(int i=1;i<=n/2;i++)
            cout<<i<<" "<<n-i<<" ";
            cout<<n<<endl;
    }
    
}
原文地址:https://www.cnblogs.com/liyexin/p/13395587.html