摘枇杷(最大值最小化)

理工學院的枇杷快熟了,ok,大家都懂得。而且大家都知道,學校的枇杷樹都是一列一列的。現在小Y同學已經在籌劃怎麼摘枇杷了。現在我們假設有一列枇杷樹,而且每棵枇杷樹上枇杷果的數量小Y都已經知道了。

假設現在有n棵枇杷樹,小Y可以把這n棵枇杷樹分成m組,每組枇杷果的數量是這組內每棵枇杷樹上枇杷果數量的和。注意,每組的枇杷樹必須是連續的。(每組最少1棵樹,最多n棵樹)。小Y把枇杷往寢室拿的時候是一組一組拿的,所花費的力氣等於這m組中枇杷果最多的那組枇杷果的數量。現在小Y想花盡量少的力氣把這些枇杷果拿回寢室。

Input

多組測試數據,以EOF結束(<= 100組)
每組測試數據第一行有兩個數n(n <= 1000)和m(1 <=m <= n)
第二行有n個數,分別代表每顆樹上枇杷果的數量

Output

輸出小Y同學所花費的最小的力氣,每個結果佔一行。

Sample Input

3 2
1 2 3
7 5
1 4 3 1 5 2 4

Sample Output

3
5

AC代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[1010];
int n,m;
int M,ans;
int jude(int x){
	int i,s,ant;
	s=ant=0;
	for(i=0;i<n;i++){
		if(a[i]>x)return 0;
		if(s+a[i]>x){   //把當前元素與前面的元素連上,以便儘量往右劃分,如果大於,不能再把當前元素加上了 
			ant++;      //在此分段 
			s=a[i];
			if(ant>m-1)return 0;
		}
		else s+=a[i];
	}
	return 1;
}
int Berach(int l,int r){
	while(l<=r){
		int mid=(l+r)/2;
		if(jude(mid))r=mid-1;
		else l=mid+1;
	}
	return l;
}
int main()
{
	int i;
	while(cin>>n>>m){
		M=ans=0;
		for(i=0;i<n;i++){
			cin>>a[i];
			M=max(M,a[i]);
			ans+=a[i];
		}
		cout<<Berach(M,ans)<<endl;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章