工資計劃

https://oj.jdfz.com.cn/oldoj/problem.php?id=2225
一定要求出二分的範圍(最小值和最大值)!!!

#include<stdio.h>
int n,m;
int num[100005];
int trynum(int x)
{
    int sum=0;
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        sum+=num[i];
        if(sum>x)
        {
            cnt++;
            sum=num[i];
        }
    }
    cnt++;
    if(cnt>m)return 0;
    return 1;
}
int search(int l,int r)
{
    if(l==r) return l;
    else
    {
        int mid=(l+r)>>1;
        if(trynum(mid))
        {
            return search(l,mid);
        }
        else
        {
            return search(mid+1,r);
        }
    }
}
int search1(int l,int r)
{
    int mid;
    while(l<r)
    {
        mid=(l+r)>>1;
        if(trynum(mid)==0) l=mid+1;
        else r=mid;
    }
    return r;
}
int main()
{
    scanf("%d%d",&n,&m);
    int i;
    int sum=0,max=0;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&num[i]);
        sum+=num[i];
        if(max<num[i]) max=num[i];
    }
    printf("%d",search1(max,sum));
    return 0;
}

/*
附數據
7 7
100
400
300
100
500
101
400

*/

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