題目描述
輸入格式
多組數據。
第一行:一個整數 T(1<=T<=5), 表示有 T 組測試數據。
每組測試數據格式如下:
第一行: 一個整數 N(3<=N<=50)
第二行, 有個 N 整數, 第 i 個整數表示第i個人的身高 hi(1<=hi<=1000)。 按順時針給出 N 個人的身高, 空格分開。
輸出格式
輸出字典序最小的身高序列,同時滿足相鄰的兩人的身高差距最大值最小。
輸出共 T 行,每行對應一組輸入數據。
樣例數據 1
輸入 [複製]
2
5
1 3 4 5 7
4
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; }