D. 背单词的小智
题意
代码
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll a[N];
ll n,m;
bool check(ll x){
ll cnt = 0,ans = 1;
for(int i = 1;i <= n;i ++){
if(cnt + a[i] > x){
cnt = 0;
ans ++;
}
cnt += a[i];
}
return ans <= m;
}
int main(){
ll l,r;
scanf("%lld%lld",&n,&m);
for(int i = 1;i <= n;i ++){
scanf("%lld",&a[i]);
a[i] = a[i] * a[i];
l = max(l,a[i]);
r += a[i];
}
while(l < r){
ll mid = (l + r) >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
printf("%lld\n",l);
return 0;
}