题目链接:题目
大意:
一维空间内,有若干老师,学生在某个位置,双方每次最多移动一格,且都在最优走法下,多少步能抓到学生。
思路:
学生必然会被框定在某个范围内,不可能突围,如果学生在两个老师之间,那么他最多且一定能跑到中间,因为他们的速度一样,没有包围那就永远无法追上,当到达中间后,不管往哪边走都是自寻死路,需要的步数为中间的格子数除以2,向上取整;如果处在老师和边界之间,那就不用除以2。
实现方法就是先排序,这样就方便分析老师之间的相对位置,要找到学生两边的老师的位置,只需要使用upper_bound()就行,复杂度nlogn基本符合题目数据范围。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MOD 1000000007
#define fi first
#define se second
#define pii pair<int,int>
#define vec vector
void solve(){
int n, m, q;
cin >> n >> m >> q;
vec<int> b(m);
for(int i = 0; i < m; i++){
cin >> b[i];
}
vec<int> a(q);
for(int i = 0; i < q; i++){
cin >> a[i];
}
sort(b.begin(), b.end());
for(int i = 0; i < q; i++){
auto it = upper_bound(b.begin(), b.end(), a[i]);
if(it == b.end()){
cout << n - b[it - b.begin() - 1] << '\n';
continue;
}
if(it == b.begin()){
cout << b[it - b.begin()] - 1 << '\n';
continue;
}
cout << (b[it - b.begin()] - b[it - b.begin() - 1] - 1) / 2 + ((b[it - b.begin()] - b[it - b.begin() - 1] - 1) % 2 != 0) << '\n';
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin >> t;
while(t--){
solve();
}
return 0;
}