第十四届华中科技大学程序设计竞赛 K.Walking in the Forest(二分)

题目链接
题意:给定n个点,要求从第一个点经过k步到达第n个点。一次可以跨过任意多个点,求最小的最大步是多少。

题解:最小化最大值问题,二分。
一开始看见这个题知道是最小化最大值问题知道是二分但是没思路,然后想DP试一试,GG之后写二分写了一年。。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
ll num[100005];
bool C(ll d)
{
    int last = 1;
    for (int i = 1; i <= k; i++)
    {
        int cnt = last + 1;
        ll cost = num[last];
        if(cost > d)return false;//某个值大于d
        while(cnt < n && cost + num[cnt] <= d)
        {
            cost += num[cnt];
            cnt++;
        }
        if(i != k && cnt == n)return true;//没有走够k步就走到n了,要缩小d
        last = cnt;
    }
    if(last < n)return false;//走了k步没有走到n,要扩大d
    return true;//成功。
}
int main()
{
    scanf("%d %d",&n,&k);
    memset(num,0,sizeof num);
    ll sum = 0;
    for (int i = 1; i < n; i++)
    {
        scanf("%lld",&num[i]);
        sum += num[i];
    }
    ll l = -1,r = sum;
    while(r - l > 1)
    {
        ll mid = (l + r) / 2;
        if(C(mid))r = mid;
        else l = mid;
    }
    printf("%lld\n",r);
}

猜你喜欢

转载自blog.csdn.net/meituanwaimai/article/details/80144927
今日推荐