题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4377
2012年多校 , 第8场, 1008 。
方法: 。。。。 我可以说找规律么。。。。
首先想到的是 12348765 这种排法,后来发现有点不对,找到了一个反例。。。
于是在一个小时之后,找到了正确排法: 4,3,2,1,8,7,6,5,12,11,10,9,16,15,14,13 。
就是说,先将最长下降自序列排好,并且分堆,如 4,3,2,1 是第一堆,8开头第二堆,12开头第三堆,16开头第四堆 。
然后再对下降子序列堆 排成 上升序列,如 4开头,8开头,12开头,16开头 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
using namespace std;
const int inf = 0x7fffffff;
const __int64 inf64 = (__int64)inf*inf;
int main(){
int t,i,j,nn,n,kk,k,f;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
if(n==2){
puts("1 2");
continue;
}
nn=sqrt((double)(n-1))+1;
k=(n-1)/nn;
f=0;
for(i=1;i<=n;i++){
if(k+i>=nn) break;
if(f) printf(" %d",i);
else{
printf("%d",i);
f=1;
}
}
if(i<=n){
kk=(n-i+1)%nn;
for(j=i+kk-1;j<=n;j+=nn){
for(k=j;k>=i;k--){
if(f) printf(" %d",k);
else{
printf("%d",k);
f=1;
}
}
i=j+1;
}
}
puts("");
}
return 0;
}