思路
乍一看,这道题不是原题吗???
直接二分一个最大值 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 return 0。
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;
}