洛谷p1182
不知道long long不开有没有影响,left的值必须是最大的\(A_i\)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
vector<long long>a(N);
vector<long long>pre(N);
bool check(long long x) {
long long sum = 0;
int cnt = 1;
for(int i = 1; i <= n; i++) {
sum += a[i];
if(sum > x) {
sum = a[i];
cnt++;
}
}
return cnt <= m;
}
int main() {
cin >> n >> m;
long long maxa = 0;
for(int i = 1; i <= n; i++) {
cin >> a[i];
maxa = max(maxa, a[i]);
pre[i] = pre[i - 1] + a[i];
}
long long left = maxa, right = pre[n], ans = 0;
while(left <= right) {
long long mid = (left + right) / 2;
if(check(mid)) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
cout << ans << '\n';
return 0;
}

浙公网安备 33010602011771号