2020牛客多校第六场E题Easy Construction(构造算法)
链接:https://ac.nowcoder.com/acm/contest/5671/E
题意:输入两个数n,k。构造一种新序列P[1-n] 满足每一种长度存在子串的和对n取余为k。输出序列P,若有多种随便输出一种即可,若不能构造,输入-1。
题解:通过举例我们可以很快发现其实很多n,k是不能满足的。我们取一种极端情况就是长度为n时的和对n取余是不是为k,就可以判断能不能构造。构造时,我们要考虑k是否为0。
若为0,我们先放n表示长度为1时满足条件,后面再放1,n-1 , 2,n-2 ....就可以构造序列P
若k不为0,我们就先放n,k表示长度为1和2满足条件,再放k-1,k+1,k-2,k+2....这样也构成序列P
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e6+7; int a[maxn]; int main(){ ll sum=0; int t,n,m,p,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ sum+=i%n; } // cout<<sum<<endl; if(sum%n!=k){ puts("-1"); return 0; } if(k==0){ printf("%d",n); int cnt=0; for(int i=1;cnt<n/2;i++,cnt++){ printf(" %d %d",i,n-i); } printf("\n"); }else { printf("%d %d",n,k); int cnt=0; int sum=(n-2)/2; for(int i=1;cnt<sum ;i++,cnt++){ printf(" %d %d",k-i,k+i); } printf("\n"); } return 0; }

浙公网安备 33010602011771号