您的位置:首页 > 其它

codeforce 551C GukiZ hates Boxes

2015-07-17 15:09 351 查看
题意:在一条直线上有n个点,每个点上有不同数量箱子阻挡教授的道路,他有m个学生,每个学生每秒只能般一个箱子或移动右边一位,开始m个学生都在左边0点,开始向右边搬走箱子,问多少秒可以把所有箱子搬没。

也是在满足题意的条件下进行二分,我也发现二分的题难不是在于二分难写(标准的二分,注意左右边界),在于看出来这是二分和对条件judge()的写法,这题judge(),….开始 各种麻烦的模拟 还是没能成功写出。。。。妈蛋 我太弱了。。。最后还是。。。看别人题解写出来的。。。。

[code]#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);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: