改了题目之后,就是没有奇数的测试了。。。
其实可以很轻易地发现,要距离近的一方只会删除两端的,而要求远的一方会删除中间的。
那么,很明显的,剩下的两点会相差x/2个节点,于是,只要计算i和i+x/2的节点的距离即可。取最小的值。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
///vector<int>f;
LL f[200050];
int main(){
/// int n;LL t;
int n; LL t;
while(scanf("%d",&n)!=EOF){
/// f.clear();
for(int i=0;i<n;i++)
cin>>f[i];///f.push_back(t);
/* for(int i=0;i<n;i++)
cin>>t,f.push_back(t);*/
sort(f,f+n);
// sort(f.begin(),f.end());
/// bool flag=n%2?true:false;
/* while(n>2){
if(f[n-1]-f[1]<=f[n-2]-f[0]) f.erase(f.begin()+0);
else f.erase(f.begin()+n-1);
n--;
f.erase(f.begin()+n/2);
n--;
}*/
/// cout<<f[1]-f[0]<<endl;
LL ans=1e9;
for(int i=0;i+n/2<n;i++){
ans=min(ans,f[i+n/2]-f[i]);
}
cout<<ans<<endl;
}
return 0;
}