CodeForces 551C GukiZ hates Boxes

Posted kasenbob

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 551C GukiZ hates Boxes相关的知识,希望对你有一定的参考价值。

题目链接:CodeForces 551C GukiZ hates Boxes

解题思路:

  题目要求最短时间,因此我们可以先考虑最长时间,最长时间一定是一个学生从开始走到结束,每走到一处就把该处箱子搬空,所以最长时间等于走到最后一个有箱子格子的步数ed加箱子总数sum。

  接下来二分所需时间,直接搜索最短时间,每次都对假设时间进行判断。每次判断都从第一格开始,因为要搬空一个格子的箱子一定需要学生走到该处,同时所有学生可以同时移动,所以从头到尾判断要搬空该处需要多少学生,再与有的学生数量进行比较。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
long long n,m,a[maxn],ed;

bool test_ok(long long time)
{
    long long acc=0;
    long long p=0;
    for(int i=1;i<=ed;i++)
    {
        acc+=a[i];
        while(i+acc>=time)
        {
            if(i>=time) return 0;
            acc-=(time-i);
            p++;
        }
    }
    if(p<m) return 1;
    else if(p==m && acc==0) return 1;
    else return 0; 
}

int main()
{
    while(~scanf("%lld %lld",&n,&m))
    {
        memset(a,0,sizeof(a));
        long long sum=0;
        for(long long i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            sum+=a[i];
            if(a[i]!=0) ed=i;
        }
        long long left=1,right=ed+sum,mid;
        while(right-left>1)
        {
            mid=(right+left)/2;
            if(test_ok(mid)) right=mid;
            else left=mid;
        }
        printf("%lld\n",right);
    }
}

 

以上是关于CodeForces 551C GukiZ hates Boxes的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 620D D. Professor GukiZ and Two Arrays

codeforces 620D Professor GukiZ and Two Arrays

Codeforces 551 D. GukiZ and Binary Operations

Codeforces 551D - GukiZ and Binary Operations 矩阵快速幂

(分块)GukiZ and GukiZiana CodeForces - 551E

CodeForces 551 E GukiZ and GukiZiana