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);
    }
}

原文地址:https://www.cnblogs.com/KasenBob/p/10828045.html

时间: 2024-11-05 11:00:44

CodeForces 551C GukiZ hates Boxes的相关文章

Codeforces 551C GukiZ hates Boxes(二分)

Problem C. GukiZ hates Boxes Solution: 假设最后一个非零的位置为K,所有位置上的和为S 那么答案的范围在[K+1,K+S]. 二分这个答案ans,然后对每个人尽量在ans时间内搬最多的砖.可以得出至少需要多少个人才能搬完.这个可以在O(n)的时间内利用贪心得到 只要判断需要的人数是否小于等于实际的人数就好了 时间复杂度O(nlogS) #include <bits/stdc++.h> using namespace std; const int N = 1

Codeforces 551C - GukiZ hates Boxes(二分加贪心)

题意: 就是n个学生帮助教授搬箱子, 箱子分成m 堆, 每个学生每秒可以选择的两个操作 操作1,为从i堆迈向第i+1堆, 操作2,从i-1堆箱子中帮忙抱走一个箱子 问抱走所有箱子的最少时间为多少, 每个学生每秒可以同时行动 题解: 二分时间   然后再当前时间下,一个一个派出所有的学生,使其走到他能走的最远距离 代码: #include<stdio.h> int flag, value[100005], value2[100005], n, m; void find(long long int

Codeforces 551C GukiZ hates Boxes 二分答案

题目链接 题意: 一共有n个空地(是一个数轴,从x=1 到 x=n),每个空地上有a[i]块石头 有m个学生 目标是删除所有石头 一开始所有学生都站在 x=0的地方 每秒钟每个学生都可以在原地删除一块石头,或者向 → 移动一格距离 问:删除所有石头的最短时间 案例解析: 3 2 1 0 2 第一个学生第一秒向→走,第二秒删a[1]的一块石头 第二个学生一直走到头,删掉a[3] ,所以第二个学生花费是 1+1+1+2 = 5 两个学生可以同时运动. 思路: 二分答案,设答案为x,即需要x秒来搬完石

codeforces 551 C GukiZ hates Boxes

--睡太晚了...脑子就傻了-- 这个题想的时候并没有想到该这样-- 题意大概是有n堆箱子从左往右依次排列,每堆ai个箱子,有m个人,最开始都站在第一个箱子的左边, 每一个人在每一秒钟都必须做出两种选择中的一种:1若他的位置有箱子则搬走一个箱子,2往右走一步. 问把所有箱子都搞掉的最少时间-- 很显然二分一下答案,若为x秒,则每个人都有x秒,一个一个排出去搬,看是否能够搬完-- 我竟然没想到-- #include<map> #include<string> #include<

Codeforces551C:GukiZ hates Boxes(二分+贪心)

Professor GukiZ is concerned about making his way to school, because massive piles of boxes are blocking his way. In total there are n piles of boxes, arranged in a line, from left to right, i-th pile (1?≤?i?≤?n) containing ai boxes. Luckily, m stude

【CodeForces 990A】Commentary Boxes

题目链接 luogu & CodeForces 题目描述 Berland Football Cup starts really soon! Commentators from all over the world come to the event. Organizers have already built nn commentary boxes. mm regional delegations will come to the Cup. Every delegation should get

codeforces 551E. GukiZ and GukiZiana 分块

题目链接 给出n个数, m个操作, 每个操作有两种, 将一段区间加上某个值, 或者询问一个k, a[i] = a[j] = k, 输出满足条件的最大的j-i, 如果没有输出-1. 做法是将数组分块, 第一次做这种, 抄的codeforces上面的代码... #include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(

Codeforces 551E GukiZ and GukiZiana(分块思想)

题目链接 GukiZ and GukiZiana 题目大意:一个数列,支持两个操作.一种是对区间$[l, r]$中的数全部加上$k$,另一种是查询数列中值为$x$的下标的最大值减最小值. $n <= 500000, q <= 50000$ 我一开始的反应是线段树,然后发现自己完全想错了…… 这道题时限10秒,但也很容易超时.我后来是用分块过的. 把序列分成$\sqrt{n}$个块,每个块的大小为$\sqrt{n}$(最后一个块可能因为不能整除的关系可能会小一些) 每个块维护一个值$delta[

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

Problem E. GukiZ and GukiZiana Solution 一位一位考虑,就是求一个二进制序列有连续的1的种类数和没有连续的1的种类数. 没有连续的1的二进制序列的数目满足f[i]=f[i-1]+f[i-2],恰好是斐波那契数列. 数据范围在10^18,用矩阵加速计算,有连续的1的数目就用2^n-f[n+1] 最后枚举k的每一位,是1乘上2^n-f[n+1],是0乘上f[n+1] 注意以上需要满足 2^l>k.并且这里l的最大值为64,需要特判. #include <bit