Smash the Trash ——二分答案

维塔利是贝尔敦的市长。他为新市长选举做准备。作为竞选活动的一部分,他表示将让贝尔敦再次清白。
距离选举开始没有那么多时间了,所以Vitaly的公关经理Arkady决定只清理城市中心街道上的垃圾。也就是说,中央大街上有n个脏地方,从西到东从1到n编号。阿尔卡迪想在第i天把垃圾放在第i个地方。
作为贝尔敦真正的爱国者,也是维塔利团队中唯一擅长算术的人,你被要求计算参与清洁过程的最低人数。该数字在流程开始前选择一次,在所有n天内保持不变。
在与清洁专家交谈后,您意识到一名工人可以在第一天执行三个动作之一:
1.在第 i 天处理1公斤垃圾;
2.将正好2公斤的垃圾从位置i移动到位置i+1(当然,如果i=n,这是不可能的);
3.什么也不做。
如果第n天结束时所有地方都没有垃圾,那么这条街就被认为是干净的。因此,阿卡迪不得不雇佣多个人,这样他们就可以同时打扫街道。
帮助Arkady计算参与清洁过程的最小人数。

输入:
第一行包含一个整数n(1≤n≤2e5)——中心街道上脏地方的数量。
第二行包含n个整数t1、t2 、……、tn(0≤ti≤2e5)——第i位的垃圾量,单位为千克。

输出:
打印一个整数——参与清洁过程的最小人数。

输入样例1:
3
5 1 2
输出样例1:
4

输入样例2:
4
8 1 2 7
输出样例2:
7

样例解释:
在第一个例子中,阿尔卡迪可以雇佣4个人来清洁街道:在第一天,3公斤垃圾应由3个人处理,而2公斤垃圾应由一个人转移到下一个脏地方。
在第二天,你必须用4个人在2号地方处理3公斤垃圾。如果三个人处理垃圾,一个人什么都不做,这很容易做到。
第三天,4名工人需要处理2公斤垃圾。
同样的事情也不能通过雇佣3个人来完成,否则你必须从第一个地方移走4公斤垃圾,然后从第二个地方再移4公斤,然后面对第三个也是最后一个地方有6公斤垃圾的情况,而3个人无法处理掉所有的6公斤垃圾。
在第二个例子中,答案不能小于7,因为最后一个地方有7公斤垃圾,而阿尔卡迪必须雇佣至少7个人来处理。

解析:
经典的二分答案,可以分析出在这道题的答案范围具有单调性,在最优解的左面都不满足题意,在最优解的右面及最优解都符合题意,通过二分枚举答案就可以了。

#include 
using namespace std;
#define int long long 
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair PII;
const int N=2e6+10;
int n;
int a[N],b[N];
bool check(int mid)
{
    for (int i=0;i2*mid) return 0;
        if (b[i]>n;
    for (int i=0;i>a[i];
    int l=0,r=2e9;
    while (l>1;
        if (check(mid)) r=mid;
        else l=mid+1;
    }
    cout<

你可能感兴趣的:(算法,数据结构)