专栏文章

题解:CF2005B2 The Strict Teacher (Hard Version)

CF2005B2题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minyht2h
此快照首次捕获于
2025/12/02 10:25
3 个月前
此快照最后确认于
2025/12/02 10:25
3 个月前
查看原文

题目大意

在一个长度为 nn 的数轴上有 mm 个老师,给出 qq 次询问,每每次询问一个学生的位置 pp。每一回合学生先集体移动一个单位,然后老师再移动一个单位,可以选择不移动,求最后可以抓到多少个学生。

题目解法

  • 如果一个学生有一端(左边或者右边)没有一个老师哪么就一直往没有老师的方向走,一直到尽头不动让老师尽可能晚的抓到自己就是最优解。
  • 如果一个学生两边都有老师,哪么到两个老师的正中间等死就行。

如何找到老师位置

使用二分查找快速确定老师位置。

给出代码

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 条评论,欢迎与作者交流。

正在加载评论...