每日一题 - 231127 - F - Minimize Bounding Square

文章描述了一个使用二分查找算法解决F-MinimizeBoundingSquare问题的过程,该问题涉及在一个给定的二维坐标中找到最小的边长,使得最多k对点之间的距离超过这个边长。时间复杂度为O(N*logN)。

  • TAG - 二分 二分 二分
  • 时间复杂度 - O ( N ∗ l o g N ) O(N \ast log N) O(NlogN)
//
#include<bits/stdc++.h>
using namespace std;
#define int long long 

const int N=2e5+6;
int x[N],y[N];
int n,k;

bool f( int mid )
{
    int cnt=0;
    for( int i=1;i<=n/2;i++ )
    {
        cnt+=max( 0LL,x[n-i+1]-x[i]-mid );
        cnt+=max( 0LL,y[n-i+1]-y[i]-mid );
    }
    return cnt<=k ;
}

void solve()
{
    scanf("%lld%lld",&n,&k );
    for( int i=1;i<=n;i++ ) scanf("%d%d",&x[i],&y[i] );

    sort( x+1,x+n+1 );
    sort( y+1,y+n+1 );

    int L=0,R=1e9;
    while( L<R )
    {
        int mid=( L+R )>>1;
        if( f(mid) )    R=mid;
        else            L=mid+1;
    }
    printf("%lld\n",L );
}

signed main()
{
    int t=1;
    // scanf("%lld",&t );
    while( t-- ) solve();
    return 0;
}

实现细节


参考示意图


参考链接


作者 | 乐意奥AI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值