求 n 的一个全排列,使其两两之间存在 K 种差值 1 ≤ n,K ≤ 10^5

思路:1-n 最多凑出 n-1 种差值所以让前 k+1 项差值为 1 到 k,后面的 差值全为 1

形如 1 7 2 6 3 5 4 这样差值是 6 5 4 3 2 1

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define maxn 100010
#define ll long long
#define IL inline
#define clear(a) memset(a,0,sizeof a)

int n,k,tot,delate;
int a[maxn],lazy[maxn];

int main()
{
    a[1]=1,lazy[1]=1;
    scanf("%d%d",&n,&k);
    delate=n-1;
    for(int i=2;i<=n;i++){
        if(tot<k-1){
            if(a[i-1]+delate<=n&&!lazy[a[i-1]+delate]){
                a[i]=a[i-1]+delate,tot++,lazy[a[i-1]+delate]=1,delate--;
                continue;
            }
            if(a[i-1]-delate>=1&&!lazy[a[i-1]-delate]){
                a[i]=a[i-1]-delate,tot++,lazy[a[i-1]-delate]=1,delate--;
                continue;
            }

        }
        else{
            if(!lazy[a[i-1]+1]&&a[i-1]+1<=n){
                a[i]=a[i-1]+1,lazy[a[i-1]+1]=1;
            }
            else if(!lazy[a[i-1]]-1&&a[i-1]-1>=1)
                a[i]=a[i-1]-1,lazy[a[i-1]-1]=1;
        }
    }
    for(int i=1;i<=n;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}
12-28 00:25