求 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; }