题意:n个城市在x轴上的坐标c[i],m个灯的坐标d[i],每个灯的射程在[d[i]-r,d[i]+r],求最小的r使得所有的城市都可以被灯覆盖
思路:单调函数,r越大肯定覆盖的概率越大.二分r
#include<bits/stdc++.h> #define PI acos(-1.0) #define pb push_back #define F first #define S second #define debug puts #define setp cout << fixed << setprecision(3) #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; typedef long long ll; const int N=1e5+5; const int MOD=1e9+7; const ll INF=1e18+8; ll a[N],b[N],n,m; bool check(ll mid){ int cnt=0; int now=1; for(int i=1;i<=m;i++){ ll l=b[i]-mid; ll r=b[i]+mid; while(a[now]>=l&&a[now]<=r&&now<n+1) cnt++,now++; /// 最多跑n次 } return cnt==n; } int main(void){ FAST_IO; cin >> n>> m; for(int i=1;i<=n;i++) cin >> a[i]; for(int i=1;i<=m;i++) cin >> b[i]; ll l=0,r=1e18,ans; while(l<=r){ ll mid= l+r >> 1; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } cout << ans << endl; return 0; } /******** *********/