首页 > 代码库 > 09:LGTB 学分块

09:LGTB 学分块

总时间限制: 
10000ms
 
单个测试点时间限制: 
1000ms
 
内存限制: 
65536kB
描述

LGTB 最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成 3 块

今天他得到了一个数组,他突然也想把它分块,他想知道,把这个数组分成 3 块,块可以为空。假设 3 块各自的和中的最大值最小

请输出分完之后 3 块中的最大值

输入
输入第一行包含一个整数 n 代表数组大小
接下来 n 个整数 a1 , a2 , ..., a n ,代表数组
输出
输出包含 1 个整数,代表分块完成后 3 块中的最大值
样例输入
10
2 5 1 4 7 3 6 2 5 1
样例输出
14
提示
对于 40% 的数据,1 ≤ n ≤ 10
对于 70% 的数据,1 ≤ n ≤ 1e3
对于 100% 的数据,1 ≤ n ≤ 1e5 , 1 ≤ ai ≤ 1e7
【思路】二分答案 加long long多30分,修改左端点+10分,一开始我的左端点是0.全场第一个AC热烈鼓掌啊哈哈哈。
【code】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Max 100009
long long a[Max];
long long tot,n,mid,l,r,ans;
long long Minn=2147483647;
bool check(long long x)
{
    long long cnt=1,totscor=0;
    for(int i=1;i<=n;i++)
    {
        totscor+=a[i];
        if(totscor>x)
        {
            totscor=a[i];
            cnt++;
            if(cnt>3)
            {
                return 0;
            }
        }
    }
    return 1;
}
int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        Minn=min(a[i],Minn);
        tot+=a[i];
    }
    l=Minn;r=tot;
    while(l<=r)
    {
        mid=(l+r)>>1;
        if(check(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }
    printf("%lld",ans);
    return 0;
}

 

09:LGTB 学分块