/*1376. Monthly Expense(二分法)
给出一段每天的花费,要求分成M段,使得每种分发中最大段和最小
先求出总和,依次二分mid来遍历数组看该分法是否适合
如果发现段数超过M或者单天的值超过mid则不可行,说明mid分得太小。
否则就可行。然后继续缩小mid
*/
#include <iostream>
#include <cstdio>
#include <stdlib.h>
using namespace std ;
int a[100005] ;
int sum ;
int n, m ;
bool can(int mid)
{
int j = 1 ,i = 0 ;
int temp = 0 ;
for( ; j <= n ; j ++)
{
if(temp + a[j] <= mid)
{
temp = temp + a[j] ;
}
else
{
//当某段和超过mid,则段数+1
i ++ ;
temp = a[j] ;
//如果某单个值比mid还要大,说明mid过小。
if( temp > mid) return false ;
//或者段数i超过指定m值,说明mid太小
if( i > m) return false ;
}
}
if(temp > 0 ) i ++ ;
return i <= m ;
}
int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
for(int i = 1 ; i <= n ; i ++)
{
scanf("%d",&a[i]) ;
sum = sum + a[i] ;
}
int low = 0 ;
int high = sum;
int mid = 0 ;
while(low < high)
{
mid = ( low + high ) / 2 ;
if( can (mid) )
{
high = mid ;
}
else
low = mid + 1 ;
}
cout << high << endl;
}
system("pause");
return 0;
}
1376. Monthly Expense(二分法求每月最大支出)
最新推荐文章于 2021-06-26 12:51:10 发布