二分的初步= =

题目戳这里
题目描述 Description
yh拥有一条街道,街道上共有n间房子,每间房子的坐标为xi(yh的房子比较神奇,可能重叠)。

同时,yh有m个女朋友(这是事实),yh打算给每位女朋友分配一间房子。两个女朋友间的距离相隔越近,她们之间产生冲突的可能就越高。yh想尽可能的减小女朋友间的冲突,于是他打算让他的女朋友间的最小距离最大,你能帮yh找出这个最大值吗?

输入描述 Input Description
第一行两个整数,n,m,表示yh有n间房子,有m个女朋友

第二行为n个整数,xi,表示各间房子的坐标。
输出描述 Output Description
输出1行,表示yh女朋友间的最小距离的最大值

样例输入 Sample Input
5 3

1 2 8 4 9
样例输出 Sample Output
3

刷了好久的二分…………

这道题是一道二分裸题,使得女朋友们(绝对是大于0小于等于2(手动斜眼))之间的距离最小值最大
什么是二分呢
其实很简单的就一句话:二分答案+验证
对于一个可行解来说,从1开始无限枚举总会得到的,但是这样实在是太慢
那么,假如说一个题中1~100000都是不行的,200000~∞都是不行的,那么这一部分应该也就没有枚举的必要了

推广一下,只要答案满足单调性,那么只需要枚举一个上界和一个下界,再验证答案是不是在这个区间内即可
这样的话,O(不知道有多大)的复杂度就可以简化为O(logn)
因此
二分女朋友之间的距离,之后在判断能否在这个范围内成立就可以了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
int xl[1245000];
int n,m;
bool check(int mid){
    int last=1;
    int cnt=m-1;
    for(int i=1;i<m;i++){
        int now=last+1;
        while(now<=n&&xl[now]-xl[last]<mid){
            now++;
        }
        if(now<=n){
            last=now;
            cnt--;  
        }
    }
    if(cnt>0){
        return false;
    }
    return true;
}
int div(){
    int down=1,up=847483647;
    while(down+1<up){
        int mid=(up+down)/2;
        if(!check(mid)) up=mid;
        else
        down=mid;
    }
    return down;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%d",&xl[i]);
    }
    sort(xl+1,xl+1+n);
    cout<<div()<<endl;
    return 0;
}

其实这道题是挑战程序设计里面的原题= =

### 关于天梯赛中的二分算法实现与解题思路 在处理大规模数据集的情况下,如天梯赛中涉及的大规模输入(例如 $N \leq 10^5$ 和 $k \leq 10^5$),暴力枚举的方法显然不可取[^2]。因此,在设计解决方案时,应优先考虑时复杂度较低的高效算法。 #### 使用二分法的前提条件 对于能够应用二分查找的问题,通常需要满足以下两个基本前提: 1. 数据具有有序性; 2. 能够通过某种方式快速判断目标值是否存在或其位置范围。 如果题目描述中提到的数据结构本身具备上述特性,则可以直接采用标准的二分查找逻辑来解决问题。然而,当原始数据无序时,可能需要先对其进行预处理操作(比如排序)。需要注意的是,这种额外开销可能会增加整体运行时,需权衡利弊后再决定是否实施此策略[^1]。 #### 示例代码展示 下面提供了一个基于Python语言编写的通用版本二分查找函数作为参考: ```python def binary_search(arr, target): left, right = 0, len(arr)-1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid # 返回索引位置 elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # 若未找到则返回-1表示失败 ``` 在此基础上,针对具体应用场景调整参数定义即可适应不同类型的查询需求。 #### 结合实际案例分析 假设某次竞赛中有多个学校参与,并记录每所学校派出团队数量情况如下所示[^3]: `[7, 9, 8,... ]`, 此处省略部分代表其他学校的相应数值。 如果我们希望定位某个特定编号所属的具体院校信息而无需逐一扫描整个列表的话,就可以利用上面介绍过的二分技术加速检索过程。 但是值得注意的一点在于原数组并非天然升序排列状态,所以在此之前还需要执行一次初步整理工作——即按照从小到大顺序新安排元素分布关系之后再调用binary_search()方法完成最终判定任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值