题意:
让你给每一个城市找一个塔来覆盖,然后叫你求出最小的覆盖半径,城市和塔都在一条直线上
题解:
我们直接枚举每一个城市,然后二分找一个最近的塔来覆盖
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef long long ll; 5 6 const int N=1E5+7; 7 int a[N],b[N]; 8 9 void up(int &a,int b){if(a<b)a=b;} 10 11 int main(){ 12 int n,m,eda=1,edb=1; 13 scanf("%d%d",&n,&m); 14 F(i,1,n)scanf("%d",a+i); 15 F(i,1,m)scanf("%d",b+i); 16 F(i,2,n)if(a[i]!=a[eda])a[++eda]=a[i];//去重 17 F(i,2,m)if(b[i]!=b[edb])b[++edb]=b[i];//去重 18 int ans=0; 19 F(i,1,eda){ 20 int pos=lower_bound(b+1,b+1+edb,a[i])-b-1; 21 int tp=INT_MAX;//找一个最近的塔来更新答案 22 if(pos>=1)tp=min(tp,a[i]-b[pos]); 23 if(pos<edb)tp=min(tp,b[pos+1]-a[i]); 24 up(ans,tp); 25 } 26 printf("%d ",ans); 27 return 0; 28 }