找规律的题目,在比赛的时候想到把数据倒过来了,但是没有想到sqrt(n)....
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int a[100010];
int main()
{
int t,n,i,tmp,q,p,tmp1,tmp2,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==1) printf("1\n");
else if(n==2)
printf("1 2\n");
else{
memset(a,0,sizeof(a));
q=ceil(sqrt(n));
p=n%q;
if(p==0) p=q;
//cout<<"p="<<p<<endl;
if((n-p)/q+2<=q)
{
printf("1");
for(i=p;i>1;--i)
printf(" %d",i);
}
else
{
for(i=p;i>1;--i)
printf("%d ",i);
printf("1");
}
i=1;
tmp2=n;
while(1)
{
tmp=n-q*i+1; //cout<<"tmp="<<tmp<<endl;
tmp1=n-q*(i-1);
for(j=tmp;j<=tmp1;j++)
a[j]=tmp2--;//cout<<"tmp2="<<tmp2<<endl;
i++;
if(tmp-p==1) break;
}
for(i=p+1;i<=n;i++)
printf(" %d",a[i]);
printf("\n");
}
}
return 0;
}