标签:二分 数列 ybtoj ll mid include leqslant lld
数列分段
ybtoj 二分-1-1
题目大意
给出一个序列A,让你把它分成m段,使每段和最大值最小
输入样例
5 3
4 2 4 5 1
输出样例
6
数据范围
1
⩽
M
⩽
N
⩽
1
0
5
1\leqslant M\leqslant N\leqslant 10^5
1⩽M⩽N⩽105
s
u
m
{
A
i
}
⩽
1
0
9
sum\begin{Bmatrix}A_i\end{Bmatrix}\leqslant 10^9
sum{Ai}⩽109
解题思路
二分枚举答案
然后
O
(
n
)
O(n)
O(n)判断
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll n, m, l, r, mid, a[100010];
bool check(ll x)//判断
{
ll g = 0, gg = 1;
for (int i = 1; i <= n; ++i)
if (g + a[i] <= x) g += a[i];
else g = a[i], gg++;//新的一段
return gg <= m;
}
int main()
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%lld", &a[i]);
l = max(l, a[i]);
r += a[i];
}
while(l < r)//二分
{
mid = (l + r)>>1;
if (check(mid)) r = mid;
else l = mid + 1;
}
printf("%lld", l);
return 0;
}
标签:二分,数列,ybtoj,ll,mid,include,leqslant,lld 来源: https://blog.csdn.net/ssllyf/article/details/112381344
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。