09:LGTB 学分块

时间:2022-05-08
本文章向大家介绍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

全局题号7414提交次数14尝试人数7通过人数2

你的提交记录

#

结果

时间

4

Accepted

07-16

3

Wrong Answer

07-16

2

Time Limit Exceeded

07-16

1

Time Limit Exceeded

07-16

  • ©2002-2013 POJ 沪ICP备12005590号-3

二分答案秒过

以后写二分答案不写l++了,慢的要死。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #define lli long long int 
 6 using namespace std;
 7 const lli MAXN=100000001;
 8 void read(lli &n)
 9 {
10     char c='+';lli x=0;bool flag=0;
11     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
12     while(c>='0'&&c<='9')
13     x=(x<<1)+(x<<3)+c-48,c=getchar();
14     flag==1?n=-x:n=x;
15 }
16 lli a[MAXN];
17 lli l,r;
18 lli n;
19 bool pd(lli num)
20 {
21     lli now=0;
22     lli tot=0;
23     for(lli i=1;i<=n;i++)
24     {
25         if(now+a[i]<num)
26             now+=a[i];
27         else if(now+a[i]==num)
28             tot++,now=0;
29         else if(now+a[i]>num)
30             tot++,now=a[i];
31     }
32     if(now)
33         tot++;
34     if(tot>3)
35         return 0;
36     else 
37         return 1;
38 }
39 int  main()
40 {
41     read(n);
42     for(lli i=1;i<=n;i++)
43         read(a[i]),r+=a[i],l=max(l,a[i]);
44     while(l<=r)
45     {
46         lli mid=(l+r)>>1;
47         if(pd(mid))
48             r=mid-1;
49         else 
50             l=mid+1;
51     }
52     printf("%lld",l);
53     return 0;
54 }