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