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
#include<cstdio>
#include<iostream>
using namespace std;
#define LL long long
int n;
int a[100004];

int  check(int x)
{
    int num=1,sum=0;
    for(int i=1;i<n;i++)
    {
        sum+=a[i];
        if(sum+a[i+1]>x)num++,sum=0;
    }
    if(num>3)return 1;
    return 0;
}
int main()
{
    cin>>n;
    LL r=0,l=0x7fffffff;
    for(int i=1;i<=n;i++)cin>>a[i],r+=a[i],l=min(l,a[i]);
    int ans=0;
    int tmp=0;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(check(mid))ans=mid,l=mid+1;
        else r=mid-1;
    }
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2017-07-18 17:01  zzzzx  阅读(244)  评论(0编辑  收藏  举报