分治法——二分答案

有时,直接由问题求得答案十分困难,而已知答案来验证答案正确性则要容易得多,此时可以考虑直接枚举答案。当然,大部分时候直接暴力枚举答案的时间复杂度肯定超出了题目要求,这时我们就可以通过二分答案的方式来加快枚举。

例题1:

D-数列分段 II_Part1.2 基础算法-二分与三分

这题想直接求得答案是很困难的,但是如果我们已知了答案是x,即数列分为M段后,每段和的最大值为x,此时可以通过以下方式验证正确性:

由于分段必须连续,所以我们对数列的第一个数开始一直求和,当在第i个数字求和大于x时,说明i不能被划分到这一段中,所以从i开始向后划分下一段,继续求和,重复以上操作,当划分完所有分段后,如果划分出的分段数大于M,则说明不能在每段和的最大值为x的情况下将数列划分为M段,因为此时,无论你将多出的分段划分到M中的任意一段中,都会导致该分段的和超过x。

那么,本题我们就可以通过二分答案的方式找出x的最小值。根据题意,x的取值范围可以缩小至数列中的最小值到数列的总和,我们在这个范围内二分答案,找出x的最小值。示例代码如下:

python 复制代码
# 获取题目输入
N, M = map(int, input().split())
A = list(map(int, input().split()))

# 二分答案
left = min(A)
right = sum(A)


# 检查和最大值为x时,能否被分为M段
def check(x):
    sum_current = 0
    sum_before = 0
    count = 1
    for e in A:
        if e > x:
            return False
        if sum_current + e - sum_before > x:
            sum_before = sum_current
            sum_current += e
            count += 1
        else:
            sum_current += e
    if count > M:
        return False
    return True


while left < right:
    mid = (left + right) >> 1
    if check(mid):
        right = mid
    else:
        left = mid + 1
print("%d" % left)

例题2:

A-愤怒的牛_Part1.2 基础算法-二分与三分

本题同例题一,当已知了答案是x即牛舍间的距离最小距离为x时,可以通过以下方式验证:

我们对牛舍按位置从小到大排序,按贪心思想,从第一个位置开始放置牛,从下一个位置开始,如果到前一个位置的距离小于x则不能放置牛,只有大于等于x时可以放置牛,按此规则一直尝试到最后一个位置,如果此时放置的牛的数量小于m,则说明不能在牛舍间的距离最小距离为x放置m头牛。

答案的范围在0~牛舍相距最远的距离,在这个范围内二分答案,找出x的最大值。示例代码如下:

python 复制代码
# 获取题目输入
import sys

input = sys.stdin.read
data = input().split()
n = int(data[0])
m = int(data[1])
a = list(map(int, data[2:2+n]))
a.sort()  # 升序排序


# 二分答案
left = 0
right = a[-1] - a[0]


# 最小距离为x时,能否放入m头牛
def check(x):
    cnt = 0
    before = 0
    for i in range(len(a)):
        if i == 0:
            cnt += 1
            continue
        if a[i] - a[before] >= x:
            cnt += 1
            before = i
    return cnt >= m


while left < right:
    mid = (left + right + 1) >> 1
    if check(mid):
        left = mid
    else:
        right = mid - 1
print("%d" % left)
相关推荐
智鸟科技GemeOpen开发者智能设备34 分钟前
智能插座二次开发如何接入Home Assistant,从零开始完整工程实现(Python+React)
开发语言·python·物联网·react.js·智能家居
hqyjzsb1 小时前
法律 Prompt 干货:搭建合同审查提示词要包含哪些要素
开发语言·人工智能·python·职场和发展·数据分析·prompt·业界资讯
Andreapiki1 小时前
风险审计校招技术栈拆解:SQL、Python、Power BI在2026届JD中的真实权重
数据库·python·sql
Discipline10291 小时前
尼泊尔河流流量:天气驱动的预测与高流量风险
人工智能·算法
2601_966949651 小时前
股票池发生变化后,如何高效更新行情数据?从全量刷新到增量同步
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
XuCoder1 小时前
改一个数,右边全得重算,这题怎么扛住两万次查询
算法
小羊没烦恼!2 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
玖石书2 小时前
python-uv-windows环境安装方案
windows·python·uv
weixin_307779132 小时前
基于睿擎工业开发平台的预训练视觉模型轻量化适配与低代码部署优化
开发语言·算法
happylifetree2 小时前
Python06-08:Python开发工具PyCharm安装
python·pycharm