1544: 【分治】【二分答案】月度开销

题目描述

农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。

约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。

约翰的目标是合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。

输入

第一行包含两个整数N,M,用单个空格隔开。

接下来N行,每行包含一个1到10000之间的整数,按顺序给出接下来N天里每天的开销。

输出

一个整数,即最大月度开销的最小值。

样例输入

7 5
100
400
300
100
500
101
400

样例输出

500

C++:

#include
using namespace std;
int a[100005],n,m;
bool istrue(int min){
	int sum=0,month=1;
	for(int i=0;imin){
			sum=a[i];
			month++;
		}else{
			sum+=a[i];
		}
	}
	if(month<=m)return true;
	return false;
}
int main(){
	int max=0,sum=0;
	scanf("%d%d",&n,&m);
	for(int i=0;i>a[i];
		if(a[i]>max)
		max=a[i];
		sum+=a[i];
	}
	int l=max,r=sum,mid,result;
	while(l<=r){
		mid=(l+r)/2;
		if(istrue(mid)){
			result=mid;
			r=mid-1;
		}else
		l=mid+1;
	}
	printf("%d",result);
    return 0;
}

 

你可能感兴趣的:(C++,C3,枚举算法,算法,c++)