比较简单的一道思维题
首先要找两个山峰
h
i
h_i
hi和
h
j
h_j
hj满足
m
i
n
∣
h
j
−
h
i
∣
min|h_j-h_i|
min∣hj−hi∣,那我们将
h
h
h按升序排序,然后找出
d
e
t
=
m
i
n
(
d
e
t
,
h
[
i
]
−
h
[
i
−
1
]
)
det=min(det,h[i]-h[i-1])
det=min(det,h[i]−h[i−1]),用
p
o
s
pos
pos记录最小的
d
e
t
det
det时的位置
i
i
i,然后我们要满足山峰困难度最大,那我们就将
p
o
s
pos
pos位置排第一个,按升序位置排下去,排完后再从头开始排到
p
o
s
−
1
pos-1
pos−1,即可符合条件
P
S
PS
PS:n=2时,记得特判
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,a[N],t;
int main(){
cin>>t;
while(t--){
cin>>n;
int det=0x3f3f3f3f,pos=0;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
if(n==2){
cout<<a[1]<<" "<<a[2]<<endl;
continue;
}
for(int i=2;i<=n;i++){
if(a[i]-a[i-1]<det) {
det=a[i]-a[i-1];
pos=i;
}
}
for(int i=pos;i<=n;i++) cout<<a[i]<<" ";
for(int i=1;i<pos;i++) cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}