题目链接:http://codeforces.com/contest/551/problem/C
题意:
一共有n个空地,数轴1~n,每个空地上有a[i]块石头,有m个学生,目标是删除所有石头,一开始所有学生都站在x=0的地方,一开始所有学生都站在 x=0的地方,问删除所有石头的最短时间
解题思路:
最后一个有石头的空地记为p,石头总和记为ans
那么时间的范围是p~p+ans
二分枚举时间,判断是否满足
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll __int64
ll a[100005];
int p,n,m;
bool check(ll x)
{
ll s=0;
int cnt=m;
for(int i=1;i<=p;i++)
{
s+=a[i];
while(s+i>=x)
{
s-=x-i;
cnt--;
if(cnt<0) return 0;
}
}
if(cnt==0) return s<=0;
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
ll ans=0,sum;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
ans+=a[i];
if(a[i]) p=i;
}
ll l=p,r=p+ans;
while(l<=r)
{
ll mid = (l+r)>>1;
if(check(mid))
{
sum=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("%I64d\n",sum);
return 0;
}

379

被折叠的 条评论
为什么被折叠?



