首页 > 代码库 > 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 学分块
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。