理工學院的枇杷快熟了,ok,大家都懂得。而且大家都知道,學校的枇杷樹都是一列一列的。現在小Y同學已經在籌劃怎麼摘枇杷了。現在我們假設有一列枇杷樹,而且每棵枇杷樹上枇杷果的數量小Y都已經知道了。
假設現在有n棵枇杷樹,小Y可以把這n棵枇杷樹分成m組,每組枇杷果的數量是這組內每棵枇杷樹上枇杷果數量的和。注意,每組的枇杷樹必須是連續的。(每組最少1棵樹,最多n棵樹)。小Y把枇杷往寢室拿的時候是一組一組拿的,所花費的力氣等於這m組中枇杷果最多的那組枇杷果的數量。現在小Y想花盡量少的力氣把這些枇杷果拿回寢室。
Input
每組測試數據第一行有兩個數n(n <= 1000)和m(1 <=m <= n)
第二行有n個數,分別代表每顆樹上枇杷果的數量
Output
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;
}
}