专栏文章
题解:CF2005B2 The Strict Teacher (Hard Version)
CF2005B2题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minyht2h
- 此快照首次捕获于
- 2025/12/02 10:25 3 个月前
- 此快照最后确认于
- 2025/12/02 10:25 3 个月前
题目大意
在一个长度为 的数轴上有 个老师,给出 次询问,每每次询问一个学生的位置 。每一回合学生先集体移动一个单位,然后老师再移动一个单位,可以选择不移动,求最后可以抓到多少个学生。
题目解法
- 如果一个学生有一端(左边或者右边)没有一个老师哪么就一直往没有老师的方向走,一直到尽头不动让老师尽可能晚的抓到自己就是最优解。
- 如果一个学生两边都有老师,哪么到两个老师的正中间等死就行。
如何找到老师位置
使用二分查找快速确定老师位置。
给出代码
CPP#include<bits/stdc++.h>
using namespace std;
int T,n,m,q,b[100001],a,l,r,lef,rig,mid,ans;
int main(){
scanf("%d",&T);//注意有多组数据
while(T --){
scanf("%d%d%d",&n,&m,&q);
for(int i = 1;i <= m;i ++){
scanf("%d",&b[i]);
}
sort(b + 1,b + m + 1);
for(int i = 1;i <= q;i ++){
scanf("%d",&a);
l = 0,r = m;
while(l < r){//二分查找
mid = l + r + 1 >> 1;
if(b[mid] < a){
l = mid;
}
else{
r = mid - 1;
}
}
if(!l){
ans = b[1] - 1;
}
else if(l == m){
ans = n - b[m];
}
else{
lef = b[l];
rig = b[l + 1];
if((rig - lef) % 2 == 1){
ans = (rig - lef - 1) / 2;
}
else{
ans = (rig - (rig + lef >> 1));
}
}
printf("%d\n",ans);
}
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...