二分(洛谷-P1182)
发布日期:2021-05-16 17:24:47 浏览次数:16 分类:精选文章

本文共 882 字,大约阅读时间需要 2 分钟。

#include 
#include
#include
using namespace std;
int a[100005];
int n, m;
int high, low = 0;
bool check(int flag) {
int sum = 0;
int cnt = 1; // 第一段
for (int i = 1; i <= n; i++) {
sum += a[i];
if (sum > flag) {
cnt++;
sum = a[i]; // 每一段的开头
}
}
return cnt > m;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
low = max(low, a[i]);
high += a[i];
}
while (low < high) {
int mid = (low + high) / 2;
if (check(mid)) {
low = mid + 1;
} else {
high = mid;
}
}
// 该代码正确运行时,low即为最小长度
cout << low << endl;
}

以上代码实现了一个基于二分查找的算法,用于寻找数组中最小和的子数组长度。该算法通过递减查找区间,快速缩小搜索范围,最终返回所需最小长度。这段代码通过将整个数组和范围记录在low和high变量中,并利用check函数判断当前区间中的最小和的子数组长度是否超过给定值m,从而进行二分查找操作。

上一篇:POJ-3984 DFS+路经查询+手动模拟队列
下一篇:二分 (洛谷P1577)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月21日 12时34分30秒