csu1023 修路(二分查找)

一道中文题,对所需时间进行二分,可以得到答案,注意一下细节即可。

以下是代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
int n,m,temp;
int a[345];

bool judge(int tim)
{
    int ret=0,team=1;
    for(int i=0;i<n;i++){
        if(ret+a[i]<=tim){
            ret+=a[i];
        }
        else {
            ret=a[i];
            if(ret>tim)return 0;
            team++;
        }
    }
    if(team<=m) return 1;
    if(team>m) return 0;
}

int bfind()
{
    int l=0,r=temp+1,mid;
    while(l<r){
        mid=l+(r-l)/2;
        if(judge(mid))r=mid;
        else l=mid+1;
    }
    return l;
}
int main()
{
   // freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--){
        memset(a,0,sizeof(a));
        scanf("%d%d",&n,&m);
        temp=0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            temp+=a[i];
        }
        int ans=bfind();
        printf("%d\n",ans);

    }
    return 0;
}


阅读更多
换一批

没有更多推荐了,返回首页