洛谷P1182
作者:
hongye
,
2025-04-16 20:16:38
· 辽宁
,
所有人可见
,
阅读 1
1....6...16
00000111111 就可以用二分来解决
#include <iostream>
using namespace std;
const int N = 100010;
typedef long long LL;
int val[N];
int n , m;
int num;
bool check(int mid){
int temp = 0;
int cnt = 0;
for(int i=1;i<=n;i++){
temp += val[i];
if(temp > mid) return false;
if(i+1 <= n && temp+val[i+1] <= mid) continue;
cnt++;
temp = 0;
}
return m >= cnt;
}
int find(){
int l = 0 , r = num;
int ans = 0;
while(l <= r){
int mid=(l+r)/2;
if(check(mid)){
ans = mid;
r = mid-1;
}else{
l = mid+1;
}
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",val+i);
num += val[i];
}
cout<<find()<<endl;
return 0;
}