/*
translation:
将N个数字分割成M个段,使得每个段和的最大值最小。
solution:
二分最大化最小值即可
note:
*:这道题注意输出的边界。稍不注意就会错误。现在统一总结下写法:
二分最大(小)化最小(大)值时候。check函数里面=所在的位置决定了是最大化还是最小化
而输出是输出pr是输出最大值,输出pl是输出最小值
date:
2016.11.2
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100000 + 10;
const int INF = 1e9 + 10;
int a[maxn], m, n;
bool check(int x)
{
int cnt = 0, res = 0;
for(int i = 0; i <= n; i++){
if(a[i] > x && i != n) return false;
res += a[i];
if(res > x){
res = a[i];
cnt++;
}
}
if(cnt > m) return false;
else return true;
}
int main()
{
//freopen("in.txt", "r", stdin);
while(~scanf("%d%d", &n, &m)){
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
a[n] = INF;
int mid, pl = 0, pr = INF;
for(int i = 0; i < 100; i++){
mid = (pr + pl) / 2;
if(check(mid)) pr = mid;
else pl = mid;
}
printf("%d\n", pr);
}
return 0;
}
poj3273(二分最大化最小值)
最新推荐文章于 2023-03-03 10:20:45 发布