时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
描述
如果一个1~N的排列P=[P1, P2, ... PN]中的任意元素Pi都满足|Pi-i| ≤ K,我们就称P是K-偏差排列。
给定N和K,请你求出字典序最大的K-偏差排列。
注:字典序最大指首先P1应尽量大,其次P2尽量大,再次P3尽量大 …… 以此类推。
输入
包含两个整数N和K。
对于50%的数据,1 ≤ N ≤ 10
对于100%的数据,1 ≤ N ≤ 100, 1 ≤ K ≤ 100
输出
输出一行,包含一个1~N的排列,整数之间用一个空格隔开。
5 2样例输出
3 4 1 2 5
#include<bits/stdc++.h>
using namespace std;
int linker[110],used[110],ans[110],times,N,K;
bool dfs(int p){
if(p==N+1) return true;
for(int i=min(N,p+K);i>=max(1,p-K);i--){
if(!used[i]){
used[i]=1;
ans[p]=i;
if(dfs(p+1)) return true;
used[i]=0;
}
}
return false;
}
int main()
{
int i; N=10;
for(K=1;K<=10;K++){
cout<<N<<" "<<K<<": ";
memset(used,0,sizeof(used));
dfs(1);
for(i=1;i<=N;i++) printf("%d ",ans[i]);
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,N,K;
scanf("%d%d",&N,&K);
if(K>=N-1) {
for(i=N;i>=1;i--) printf("%d ",i);
printf("\n");return 0;
}
if(K<=N/2){
int tmp=N/(K*2);
for(i=1;i<=tmp;i++){
for(j=(i-1)*2*K+1;j<=(i-1)*2*K+K;j++) printf("%d ",j+K);
for(j=(i-1)*2*K+1;j<=(i-1)*2*K+K;j++) printf("%d ",j);
}
for(i=N;i>=tmp*2*K+1;i--) printf("%d ",i);
}
else {
for(i=K+1;i<=N;i++) printf("%d ",i);
for(i=K;i>N-K;i--) printf("%d ",i);
for(i=1;i<=N-K;i++) printf("%d ",i);
}
return 0;
}