这个题的一个问题就是,我不知道为什么这样“贪心”的求月份是对的。
#include<bits/stdc++.h>
using namespace std;
//N个数,分成M组(只能将相邻的数分成一组),使和最大的那个组,和尽可能的小
//把月数视为月度开销的函数
int N,M,spend[100100];
int f(int cost){
int sum=0,fajo=1;//因为每次要等一个月不够放了,才算作一个月,所以最后一个月算不进去,要初始化为1
for(int i=0; i<N; i++){
if(sum+spend[i]>cost){//如果这个月“不足了”
sum=spend[i];//开启下一个月
fajo++;
}
else sum+=spend[i];
}
return fajo;
}
int main(){
scanf("%d%d",&N,&M);
int l=0,r=0;
for(int i=0;i<N;i++){
scanf("%d",&spend[i]);
r+=spend[i];
l=max(l,spend[i]);
}
while(l<r){
int mid=(l+r)/2;
int t=f(mid);
if(t<=M) r=mid;
else l=mid+1;
}
printf("%d",l);
}