题意:一个战士和一个箭士PK,战士是近战,他要距离箭士的尽可能近,而箭士是远战,他要距离战士尽可能远。现在,他们有n个位置,但是要去掉(n-2)个位置,从战士开始,每人轮流去掉一个位置,求如何去掉点,使他们的距离最优,输出最优距离。
题解:战士要使距离更近,应该是优先去掉边缘上的点,反之,箭士要使距离更远,应该尽可能去掉中间的位置;
战士想要使得两个位置尽可能近,而这两个位置的下标距离,再小也不能小于n/2;箭士想要使得两个位置尽可能远,而这两个位置的下标距离,再大也不能超过n/2。结合他们的小标距离,最优的应该是小标距离刚好为n/2;战士可以决定的是;选取小标距离为n/2中的最小距离。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[200005]; #define INF 0x3f3f3f3f int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); int ans=INF; int dis=n/2; sort(a,a+n); for(int i=dis;i<n;i++) ans=min(ans,a[i]-a[i-dis]); printf("%d ", ans); return 0; }