CF #330 C
改了题目之后,就是没有奇数的测试了。。。
其实可以很轻易地发现,要距离近的一方只会删除两端的,而要求远的一方会删除中间的。
那么,很明显的,剩下的两点会相差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; }