题意:在一条直线上有n个点,每个点上有不同数量箱子阻挡教授的道路,他有m个学生,每个学生每秒只能般一个箱子或移动右边一位,开始m个学生都在左边0点,开始向右边搬走箱子,问多少秒可以把所有箱子搬没。
也是在满足题意的条件下进行二分,我也发现二分的题难不是在于二分难写(标准的二分,注意左右边界),在于看出来这是二分和对条件judge()的写法,这题judge(),….开始 各种麻烦的模拟 还是没能成功写出。。。。妈蛋 我太弱了。。。最后还是。。。看别人题解写出来的。。。。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long dist[100010],n,m,tot;
int judge(long long x)
{
int cnt = m;
long long s = 0;
for(int i = 1; i<=tot; i++)
{
s+=dist[i];
while(s+i>=x)//移动箱子加移动路程的总时间超过了x
{
s-=x-i;//对于已走的路程i,那么一个人有x-i个时间来搬箱子,所以每增加一人,时间消耗可以减少x-i
cnt--;
if(cnt<0) return 0;
}
}
if(cnt==0) return s<=0;
return 1;
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
long long sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&dist[i]);
sum+=dist[i];
if(dist[i])
tot=i;
}
int l=tot,r=tot+sum;
while(l<r)
{
int mid=l+(r-l)*0.5;
if(judge(mid))
{
r=mid;
}
else
l=mid+1;
}
printf("%d\n",r);
}
}