题目链接:http://codeforces.com/gym/102392/problem/I
题解:
无论先手Alice选择a数组哪一个元素,后手Bob,必然选择b数组中与其值相邻的元素。
例如:
2 14 7 14
5 10 9 22
排序后为:
2 7 14 14
5 9 10 22
(1)如果先手选择2,则后手会选择5,此时差值为3;
(2)如果先手选择7,则后手会选择5,9,选择两个差值的最小值为2;
(3)如果先手选择14,则后手会选择10,22,选择两个差值的最小值4;
最后选择各差值的最大值,即为4;
所以使用一次遍历使用二分查找即可,注意要处理查找的时候的边界问题;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1005], b[1005];
int main(void)
{
int n;
while(~scanf("%d", &n))
{
for(int i = 1; i <= n; ++i)
scanf("%lld", a + i);
for(int i = 1; i <= n; ++i)
scanf("%lld", b + i);
sort(a + 1, a + n + 1);
sort(b + 1, b + n + 1);
ll mx = -1;
for(int i = 1; i <= n; ++i)
{
ll mn;
int p = lower_bound(b + 1, b + n + 1, a[i]) - b;
if(p == 1)mn = abs(a[i] - b[p]);//此时b中最小的元素大于a[i]
else if(p == n + 1)mn = abs(a[i] - b[n]);//此时b中最大的元素小于a[i];
else
mn = min(abs(a[i] - b[p]), abs(a[i] - b[p - 1]));
mx = max(mx, mn);
}
printf("%lld\n", mx);
}
return 0;
}