今天多題又是二分,不過自己又不知道,爲啥看不出啥二分呢,唉,看來還是要多做題
解題思路
- 首先沒看出來是二分,首先我們了來想一下爲啥是二分
- 二分的時間複雜度是logn,r大概是1e14,那麼二分可以解決,二分答案還是做題少,不太知道怎麼分析好
- 這裏的l是a中的最大值,r就是他們的合,然後直接套二分板子,然後我們判斷分成幾段即可
代碼:
#include <iostream>
#include <cstdio>
#include <cstdio>
using namespace std;
const int N = 100010;
long long a[N];
int n, m;
bool check(long long x){
long long res = 0;
int num = 1;
for (int i = 1; i <= n ; i++){
if (res + a[i] > x) {
res = a[i];
num ++;
}
else{
res += a[i];
}
}
if (num <= m) return true;
else return false;
}
int main(){
scanf("%d%d",&n,&m);
long long r = 0;
long long l = 0;
for (int i = 1; i <= n ; i ++){
scanf("%lld",&a[i]);
l = max(a[i],l);
r += a[i];
}
while(l < r){
long long mid = (l + r)>> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
printf("%lld\n",l);
return 0;
}