题意:
有n个地点,每个地点有a[i]个箱子,然后有m个人,每个人从第i个位置移动到第i+1的位置花费1S,每个人移动一个箱子花费1S,要求把所有箱子全部移除花费的最小时间是多少
思路:
有n个地点,每个地点有a[i]个箱子,然后有m个人,每个人从第i个位置移动到第i+1的位置花费1S,每个人移动一个箱子花费1S,要求把所有箱子全部移除花费的最小时间是多少
思路:
先二分枚举答案,然后对每个答案判断是否能够满足即可
// Created by Chenhongwei in 2015.
// Copyright (c) 2015 Chenhongwei. All rights reserved.
#include "iostream"
#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "climits"
#include "queue"
#include "cmath"
#include "map"
#include "set"
#include "stack"
#include "vector"
#include "sstream"
#include "algorithm"
using namespace std;
const int inf=1e8;
const int maxn=1e5+100;
typedef long long ll;
typedef unsigned long long ull;
ll a[maxn];
ll n,m,tot,sum=0;
bool check(ll t)
{
ll s=0,cnt=m;
for(ll i=1;i<=tot;i++)
{
s+=a[i];
while(s+i>=t)
{
s-=t-i;
cnt--;
if(cnt<0) return 0;
}
}
if(cnt==0) return s<=0;
return 1;
}
int main()
{
//ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
if(a[i])
tot=i;
}
ll l=tot,r=tot+sum,ans;
while(l<=r)
{
ll mid=(l+r)/2;
if(check(mid))
{
// printf("ok\n");
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%lld\n",ans);
return 0;
}