YbtOJ 二分演算法課堂過關 例1 數列分段【二分】
阿新 • • 發佈:2020-12-30
思路
乍一看,這道題不是原題嗎???
直接二分一個最大值
O
(
n
)
O(n)
O(n) 暴掃陣列即可。
時間複雜度是
O
(
n
log
n
)
O(n\log n)
O(nlogn).
注意:要判斷
a
[
i
]
>
x
a[i]>x
a[i]>x,直接輸出
r
e
t
u
r
n
0
return ~0
return0。
C o d e Code Code
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,js,ans=2147483647;
int a[100010];
bool check(int x)
{
int sum=0,row=1;
for(int i=1; i<=n; i++)
{
if(a[i]>x)
return 0;
if(sum+a[i]<=x)
sum+=a[i];
else
sum=a[i],row++;
}
if(row<=m)
return 1;
else
return 0;
}
int main()
{
cin>> n>>m;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
js+=a[i];
}
int l=1,r=js,mid=0;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))
r=mid-1,ans=min(ans,mid);
else
l=mid+1;
}
cout<<ans;
return 0;
}