superoj520 圓排列

題目描述

輸入格式

多組數據。
第一行:一個整數 T(1<=T<=5), 表示有 T 組測試數據。
每組測試數據格式如下:
第一行: 一個整數 N(3<=N<=50)
第二行, 有個 N 整數,  第 i 個整數表示第i個人的身高 hi(1<=hi<=1000)。 按順時針給出 N 個人的身高, 空格分開。

輸出格式

輸出字典序最小的身高序列,同時滿足相鄰的兩人的身高差距最大值最小。
輸出共 T 行,每行對應一組輸入數據。

樣例數據 1

輸入  [複製]



1 3 4 5 7 

1 2 3 4

輸出

1 3 5 7 4 
1 2 4 3
分析 :
     最大最小值 二分答案
此題二分答案+貪心 因爲最佳答案一定是

倒V字形的
代碼
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
int vv,n;
int a[60];
bool hehe[60];
int b[60];

bool check(int s)
{
   int i,j;
   int k=1;
   int x;
   memset(hehe,false,sizeof(hehe));
   while(k!=n)
   { 
     x=a[k]+s;
     for(i=k+1;i<=n;i++)
        {
           if(a[i]>x) break; 
        }
      i-=1;
      if(a[n]<=x) break;
      hehe[i]=true;
       
   if(i==k)  return false;
   k=i;
   }
   k=n;
   hehe[n]=true;
   while(k!=1)
    {
      x=a[k]-s;
      for(i=k-1;i>=1;i--)
        {  
           if(a[i]<x) break;
        }
      i+=1;
      while(hehe[i]==true) i++;
      if(a[1]>=x) break; 
      if(i>=k) return false;
      k=i;
      
    } 
   
     return true;
   
}


int main()
{
  // freopen("heightround.in","r",stdin);
 //  freopen("heightround.out","w",stdout);
   scanf("%d",&vv);
   int ll;
   for(ll=1;ll<=vv;ll++)
     {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        int i,j,k;
        int ans;
        scanf("%d",&n);
        
        for(i=1;i<=n;i++)
          {
            scanf("%d",&a[i]);           
          }
        
        sort(a+1,a+1+n);
     
        int tail,head;
        head=-1;
        tail=a[n]-a[1]+1;
        int mid;
        
        while((tail-head)>1)
          {
             mid=(tail+head)>>1;
             if (check(mid))  tail=mid;
             else head=mid;
                          
          }
         ans=tail;
        
        
        
        
   int x;
   k=1;
   int num=1;
   
   
   memset(hehe,false,sizeof(hehe));
   while(k!=n)
   { 
     x=a[k]+ans;
     for(i=k+1;i<=n;i++)
        {
           if(a[i]>x) break; 
           if(a[i]==x) { i++;break;}                              //
        }
      i-=1;
      if(a[n]<x ) i=n; 
      if(i<=k) break;
      hehe[i]=true;
      b[num]=a[i];
       num++;
   k=i;
   }
//   k=n;
//   b[num]=a[n];
//   num++;
//   k=n;
//   while(k!=1)
//    {
//      x=a[k]-ans;
//      for(i=k-1;i>=1;i--)
//        {  
//           if(a[i]<x) break;
//           
//        }
//       
//      if (a[i]==x) i=0;
//        
//      i+=1;
//      while(hehe[i]==true) i++;
//      
//      
//      if(a[1]>x) i=1; 
//      if(i>=k) break;
//      k=i;
//      b[num]=a[i];
//      num++;
//    } 
//     b[num]=a[1];
     
//     if(a[n-1]==a[n]) 
//        {
//          num++;
//          b[num]=a[n];
//        }
     for(i=n;i>=1;i--)
        {
          if(!hehe[i])
             {
             b[num]=a[i];
             num++;
             }
        }
     
     
     
     
     
     
     num--;
     for(i=num;i>=2;i--)
        {
          printf("%d ",b[i]);
        }
     printf("%d",b[1]);
     
     printf("\n");   
        
     }
   
   
   
   return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章