Educational Codeforces Round 15, problem: (C) Cellular Network

题意:
几个城市,几个塔,在一条直线上,已知他们的坐标,每个城市至少在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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值