士兵排队

士兵排队

题目意思是给出一些数字,互不相同,给出一个序列,使相邻的数字之差的绝对值都不相同。如3,4,5三个数字,可以排列成3,5,4,前两个数字之差为2,后两个为1,都不相同,符合条件;而不能是3,4,5,因为前两个数之差为1,后两个为1,不符合条件。

具体做法为先排序,然后从首选一个,尾选一个,直到选完。

以下是我的代码:
#include < stdio.h >
void  qsort( long  a[], long  begin, long  end)
{
    
long i=begin,j=end,mid=a[(begin+end)/2],t;
    
do{
         
while(a[i]<mid) i++;
         
while(a[j]>mid) j--;
         
if(i<=j)
         
{
            t
=a[i];a[i]=a[j];a[j]=t;
            i
++;j--;
         }

    }
while(i<=j);
    
if(i<end)   qsort(a,i,end);
    
if(j>begin) qsort(a,begin,j);
}

int  main()
{
    FILE 
*fin,*fout;
    
long t,n,i,j,k,a[10001];
    fin
=fopen("soldiers.in","r");
    fout
=fopen("soldiers.out","w");
    fscanf(fin,
"%ld",&t);
    
for(k=1;k<=t;k++)
    
{
       fscanf(fin,
"%ld",&n);
       
for(i=1;i<=n;i++)
         fscanf(fin,
"%ld",&a[i]);
       qsort(a,
1,n);
       i
=1;j=n;
       
while(j>i)
       
{
          fprintf(fout,
"%ld ",a[i]);
          fprintf(fout,
"%ld ",a[j]);
          i
++;j--;
       }

       
if(i==j)
         fprintf(fout,
"%ld",a[i]);
       fprintf(fout,
"\n");
    }

    fclose(fin);
    fclose(fout);
return 0;
}

你可能感兴趣的:(士兵排队)