en看到很多博文都说这个问题叫做最大化最小值问题 我的理解就是 在所有的情况中,找到能够让最小值最大的那种情况(这么说好像是没有问题的)
说来惭愧...看了题解才明白这题要用二分...看了题解之后想了一下二分的确是优化的最好方法
首先来考虑一下要求的“各组之和的最大值”的范围 ,这个值应该是<=最大值且>=所有数之和的,这就说明,我们要求的答案是在一个可以确定的区间里面的,所以可以考虑用二分的方法
话不多说上程序,具体可以看注释
#include <iostream>
const int maxn = 100000+5;
using namespace std;
int n,m;
int money[maxn];
bool judge_group(long long x)
{
int cnt = 1;
long long Sum = 0;
for(int i=0;i<n;i++)
{
if(Sum+money[i]<=x)
{
Sum += money[i];
}
else
{
Sum = money[i];
cnt++;
}
}
if(cnt<=m)return true;
else return false;
}
void Solve()
{
long long Sum = 0;
int Max = -1000000000;
for(int i=0;i<n;i++)
{
cin>>money[i];
if(Max<money[i])Max = money[i];
Sum += money[i];
}
long long left = Max;
long long right = Sum;
long long mid = (left+right)/2;
while(left != right)
{
if(judge_group(mid))//这说明目前是可以分成m组的 但是还不是最优的方法(因为想让所有组的值尽可能小啊 因此要继续往小的值寻找)
{
right = mid-1;
}
else left = mid+1;//不能分成m组 因此要往大的值去寻找
mid = (left + right)/2;
}
cout<<mid;
}
int main()
{
while(cin>>n>>m)
{
Solve();
}
}