题目链接
题意:给定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);
}