题解(别抄)

Kinghero King of the summit 2023-08-30 9:45:10 2023-08-30 9:45:30 0
#include <bits/stdc++.h>
#define MAX 100010 
using namespace std;
bool judge(int mid, int a[], int n, int m)
{
    int i,sum=0,t=0; 
    for(i=0;i<n;i++)
    {
        if(sum+a[i]>mid)  //如果前几个月加上这个月的钱大于这次尝试的fajo月开销,那么说明这个月的钱应该放在下个fajo月里 
        {
            sum=a[i];
            t++;  //找到一个fajo月 
        }
        else sum+=a[i];  // 否则就加上这个月 
    }
    //如果按照mid的分割方法,最大分割出t个月大于m,则可以继续增加开销,
    // 注意,这里是说,最少分出的月份是t,那么t>=m,则可以继续增加开销,以便使t变小  
    if(t>=m) return true;  
    else return false;
}
int main()
{
    int total=0, max=0, a[MAX], n, m, i;
    cin>>n>>m;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
        total+=a[i];  //记录开销的总和 
        if(max<a[i]) max=a[i];  //记录开销的最大值 
    }
    int l=max, r=total, mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(judge(mid,a,n,m)) l=mid+1; //如果可以按照要求分,就说明fajo月的开销可以变大一点 
        else r=mid-1;  // 如果不可以,则说明fajo月开销应该变小 
    }
    cout<<mid<<endl;
    return 0;
}
{{ vote && vote.total.up }}