分析
先考虑单增,最好的方式就是不断地构造出长为 \(k\) 的单增序列,为保证后面序列不会成为前面单增序列的延续,每一个序列值域上需要完全高于下一个,即本段最小值大于下段最大值,同时显然如果超过 \(k\) 个序列单减则会超出要求,因此 \(k \times k>n\) 时则输出 \(-1\) 即可。
代码
#include<bits/stdc++.h>
using namespace std;
inline void read(int &res){
res=0;
int f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=(res<<1)+(res<<3)+c-48,c=getchar();
}
int n,k;
signed main()
{
read(n);read(k);
if(1ll*k*k<n){
puts("-1");
return 0;
}
int las=n,pos=1;
while(las>=k){//还剩多少个数没放
for(int i=k;i>=1;i--){
cout<<las-i+1<<" ";
}
pos+=k;
las-=k;
}
for(int i=1;i<=las;i++){
cout<<i<<" ";
}
return 0;
}