蚂蚁运输

本文介绍了一个使用 C++ 实现的二分查找算法,该算法用于解决特定区间内的数值匹配问题。通过定义结构体存储坐标数据,并利用布尔函数进行条件判断,实现了对输入数据的有效筛选。此外,文章还提供了完整的源代码实现。
摘要由CSDN通过智能技术生成

源代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
struct Node
{
    int X,Y;
}i[1000001];
bool Check(int T) //每次Check()都想不出来,太弱T_T。
{
    int Max=-1e9,Min=1e9;
    for (int a=1;a<=m;a++)
    {
        if (i[a].Y-i[a].X<=T)
          continue;
        Max=max(Max,i[a].X+i[a].Y-T);
        Min=min(Min,i[a].X+i[a].Y+T);
    }
    if (Max>Min)
      return false;
    Max=-1e9,Min=1e9;
    for (int a=1;a<=m;a++)
    {
        if (i[a].Y-i[a].X<=T)
          continue;
        Max=max(Max,i[a].X-i[a].Y-T);
        Min=min(Min,i[a].X-i[a].Y+T);
    }
    if (Max>Min)
      return false;
    return true;
}
int main() //二分答案还是做得少啊!
{
    int T;
    scanf("%d%d",&n,&T);
    while (T--)
    {
        int t1,t2;
        scanf("%d%d",&t1,&t2);
        if (t1>t2)
          swap(t1,t2);
        if (t1!=t2) //若为0,就可以直接忽略了。
        {
            i[++m].X=t1;
            i[m].Y=t2;
        }
    }
    int Left=0,Right=n,Ans(0);
    while (Left<=Right) //二分答案。
    {
        int Mid=(Left+Right)>>1;
        if (Check(Mid))
        {
            Ans=Mid;
            Right=Mid-1;
        }
        else
          Left=Mid+1;
    }
    printf("%d",Ans);
    return 0;
}

/*
    由题可得,在L<R和X<Y的情况下,二分答案应符合,|L-X|+|R-Y|<=Mid,转化:
        L-X+R-Y<=Mid
        L-X+Y-R<=Mid
        X-L+R-Y<=Mid
        X-L+Y-R<=Mid
    综上:
        (L+R-Mid)<=X+Y<=(L+R+Mid)
        (L-R-Mid)<=X-Y<=(L-R+Mid)
    忽略中间内容,检验不等式即可。
因为负数的关系,满足其一则总不等式满足,但由于不知道是哪个分式满足,故全部枚举。
*/

转载于:https://www.cnblogs.com/Ackermann/p/6020526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值