n个数的排序方式型为:x,x+1,x+2,...n,x-p,x-p+1,x-p+2.....,x-1,......1,2,3,....p
即若干段连续上升的子序列,但其之间是从大的到小排序
分块循环节为sqrt(n)的时候答案最小。
本来写的是遍历搜索最优值,但是不知道为什么不对。。
#include<bits/stdc++.h>
#define mod 1000000007
#define For(i,m,n) for(int i=m;i<=n;i++)
#define LL long long
#define lan(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int sum=0x3f3f3f;
int id=sqrt(n),y=n%id;
if(y)
{
printf("%d ",n-y+1);
For(i,n-y+2,n)
printf("%d ",i);
}
int x=n-y;
while(x)
{
x-=id;
For(i,x+1,x+id)
{
if(i==id)
printf("%d\n",i);
else
printf("%d ",i);
}
}
}
return 0;
}