题意:有n个箱子形成的堆,现在有m个学生,每个学生每一秒可以有两种操作:

1: 向右移动一格

2: 移除当前位置的一个箱子

求移除所有箱子需要的最短时间。注意:所有学生可以同时行动。


思路:二分时间,判断当前限制的时间是否可以移除完所有箱子。那么如何判断呢? 设lim表示当前的时间限制,走到第个堆花费秒,从第n个堆开始处理,第i个堆需要的学生数是,可能,那么就剩余的箱子可以拿,既然是从1走到i那么,一定可以移除前面的箱子,这样一直就行。复杂度O(n)

AC代码

#include <cstdio>
#include <cmath>
#include <cctype>
#include <bitset>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const double pii = acos(-1.0);
const int maxn = 1e5 + 5;
int n, m;
LL box[maxn], pbox[maxn];
bool check(LL lim) {
    LL rest = 0, cnt = m;
    for(int i = n-1; i >= 0; --i) {
        pbox[i] = box[i];
        if(rest >= pbox[i]) {
            rest -= pbox[i];
            pbox[i] = 0;
        }
        else {
            pbox[i] -= rest;
            rest = 0;
        }

        LL dis = i+1;
        if(pbox[i] == 0) continue;
        if(lim <= dis) return false;
        //pbox[i] <= x*(lim-dis)
        LL num = (LL)ceil(1.0*pbox[i]/(lim-dis));
        if(num > cnt) return false;
        cnt -= num;
        rest += num*(lim-dis) - pbox[i];
    }
    return true;
}

LL solve(LL x, LL y) {
    while(x < y) {
        LL mid = (x+y) / 2;
        if(check(mid)) y = mid;
        else x = mid+1;
    }
    return y;
}

int main() {
    while(scanf("%d%d", &n, &m) == 2) {
        LL sum = 0;
        for(int i = 0; i < n; ++i) {
            scanf("%lld", &box[i]);
            sum += box[i] + i;
        }
        printf("%lld\n", solve(0, sum+5));
    }
    return 0;
}

如有不当之处欢迎指出!

CodeForces - 551C 二分+贪心的更多相关文章

  1. Codeforces 732D [二分 ][贪心]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: n天进行m科考试,每科考试需要a的复习时间,n天每天最多可以考一科.并且指定哪天考哪科. 注意考试那天不能复习. 问最少需要多少天可全部通过考试. ...

  2. Codeforces 825D 二分贪心

    题意:给一个 s 串和 t 串, s 串中有若干问号,问如何填充问号使得 s 串中字母可以组成最多的 t 串.输出填充后的 s 串. 思路:想了下感觉直接怼有点麻烦,要分情况:先处理已经可以组成 t ...

  3. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  4. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  5. CodeForces - 158B.Taxi (贪心)

    CodeForces - 158B.Taxi (贪心) 题意分析 首先对1234的个数分别统计,4人组的直接加上即可.然后让1和3成对处理,只有2种情况,第一种是1多,就让剩下的1和2组队处理,另外一 ...

  6. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  7. Codeforces_732D_(二分贪心)

    D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  8. CF732D Exams 二分 贪心

    思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...

  9. $CF949D\ Curfew$ 二分/贪心

    正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...

随机推荐

  1. python_virtualenvwrapper安装与使用

    如何创建当前python版本虚拟环境? 1. 安装virtualenv pip install -i https://pipy.doubanio.com/simple virtualenv 2. 创建 ...

  2. laravel5.5 when()的用法

    当你在使用where语句有前提条件时,比如某值为1的时候才执行where子句,否则不执行,这个时候,laravel5.5新出了一个简便方法when($arg,fun1[,fun2]). 具体用法如下: ...

  3. java 基本数据类型与变量类型

    Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. byte,short,char,int,long,float,double Java语言支持的变 ...

  4. shell第一篇

    前两天不停的再看内核相关的内容,了解内核的形成.内核的执行流程.内核的作用,结果是舍近求远. 其实我只是想了解一下shell的工作,shell与内核有关,但并不需要我么真正去做什么,至少对于我这样额初 ...

  5. nagios的安装

    Nagios通常由一个主程序(Nagios).一个插件程序(Nagios-plugins)和四个可选的ADDON(NRPE.NSCA. NSClient++和NDOUtils)组成.Nagios的监控 ...

  6. tomcat部署最佳实践(一)

    Tomcat部署最佳实践 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 tomcat是玩web软件必会技能之一,今天我给大家介绍一下tomc ...

  7. linux socket 编程(C语言)[转]

    最近看了一些网络编程的书籍,一直以来总感觉网络编程神秘莫测,其实网络编程入门还是很容易学的,下面这些代码是我在linux下编写的,已经运行过了,编译之后就可以运行了.有不足之处希望大家多多指出,共同学 ...

  8. C# 类型基础(下)

    前面介绍了基本的类型,接下来我们讲讲类型的转换 值类型的两种表现形式:未装箱和已装箱 ,而引用类型总是处于装箱形式 int count = 10; object obj = count; 装箱:值类型 ...

  9. VBA小技巧

    运用VBA时,可以构造一些函数去实现诸如printf的方便函数. Public Function printf(mask As String, ParamArray tokens()) As Stri ...

  10. html集锦

    注意:此内容为复习所总结,非专业,不全,理解记录理解会有偏差. 一.HTML解释: 指的是超文本标记语言 (Hyper Text Markup Language),不是一种编程语言,而是一种标记语言  ...