题意:
几个城市,几个塔,在一条直线上,已知他们的坐标,每个城市至少在R这一范围内有一座塔的信号,求R得最小值
题解:
比较坑,自己YY的二指针,比赛的时候没有搞出来,颇为尴尬。几次遇到int爆数据的问题,以后记得改啊,没事别用int啊。
思路就是求每个城市到塔的最近距离求最大值,由于是不减数列,所以从第一个城市开始,找到离它最近的塔,那么之后的城市的最近的塔只会在后面出现,于是简化了复杂度。
注意当到第一个塔和第二个塔距离相等时候直接下一步,这个时候记录的话会错,
10 10
1 1 2 2 2 4 4 6 7 9
0 1 3 3 3 6 7 8 9 10
比如这样的数据,要是相等就记录下来,哈哈哈哈,你就跑不出333这个序列啦,是不是一脸嘲笑的数据而你移动指针,这时候到第一个塔的值更新了,并不会丢失数据
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define pr(x) cout<<#x<<" "<<x;
#define pl(x) cout<<#x<<" "<<x<<endl;
#include<math.h>
#include<algorithm>
#include<set>
#include<map>
#include <queue>
#include<string>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
long long city[100005];
long long tower[100005];
memset(city,0,sizeof(city));
memset(tower,0,sizeof(tower));
for(int i = 0;i<n;i++){
scanf("%lld",&city[i]);
}
for(int i = 0;i<m;i++){
scanf("%lld",&tower[i]);
}
int step =0;
int num = 0;
int ans[100005];
for(int i = 0;i<n;i++){
for(int j =step;j<m;){
long long a = abs( city[i]-tower[j]);
long long b = 0x7f7f7f7f;
if(j==m-1){
b = 0x7f7f7f7f;
}
else{
b = abs( city[i]-tower[j+1]);
}
if(a>=b){j++;step++;}
else{
ans[num] = a;
num++;
break;
}
}
}
int anss=-1;
for(int i = 0;i<num;i++){
if(ans[i]>anss){anss=ans[i];}
}
printf("%d\n",anss);
}