来源:poj 3273
虽然过了。。但是这个二分好像还有问题。。mid值跟组数好像没有关系。。
#include <iostream>
using namespace std;
int n, m;
const int maxn = 100010;
int a[maxn];
bool judge(int value)
{
int cnt = 1; //当前value值可以把n天分成的组数(初始把全部天数作为一组)
int sum = 0;
for (int i = 0; i < n; i++)
{
if (sum + a[i] <= value)
{
sum += a[i];
}
else
{
sum = a[i];
cnt++;
}
}
if (cnt > m)
{
return false; //value值偏小
}
else
{
return true; //value值偏大
}
}
int main()
{
while (cin >> n >> m)
{
int low = 0;
int high = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
low = max(low, a[i]); //花费的下界是所有月中的最大值
high += a[i];
}
int mid = 0;
while (low <= high)
{
mid = (low + high) >> 1;
if (judge(mid))
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
cout << mid << endl;
}
return 0;
}