一开始读了个假题,题目要求了按顺序选。所以check直接从前往后枚举即可
accmulate要给初始值的
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int n, k;
vector<ll> a;
bool check(int x)
{
ll sum = 0;
int cnt = 1;
for (int i = 1; i <= n; i ++ ) {
if(x >= sum + a[i]) {
sum += a[i];
}
else {
sum = a[i], cnt ++ ;
}
}
return cnt <= k;
}
int main(){
//std::ios::sync_with_stdio(false);
//std::cin.tie(nullptr);
cin >> n >> k;
a.resize(n + 1);
ll L = 0, R = 0;
for (int i = 1; i <= n; i ++ ) {
cin >> a[i];
L = max(L, a[i]);
}
R = accumulate(a.begin() + 1, a.end(), 0) + 1;
while(L < R) {
int mid = L + R >> 1;
if(check(mid)) R = mid;
else L = mid + 1;
}
cout << L << '\n';
return 0;
}
模板2
check条件反,最后答案+1
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int n, k;
vector<ll> a;
bool check(int x)
{
ll sum = 0;
int cnt = 1;
for (int i = 1; i <= n; i ++ ) {
if(x >= sum + a[i]) {
sum += a[i];
}
else {
sum = a[i], cnt ++ ;
}
}
return cnt > k;
}
int main(){
//std::ios::sync_with_stdio(false);
//std::cin.tie(nullptr);
cin >> n >> k;
a.resize(n + 1);
ll L = 0, R = 0;
for (int i = 1; i <= n; i ++ ) {
cin >> a[i];
L = max(L, a[i]);
}
R = accumulate(a.begin() + 1, a.end(), 0) + 1;
while(L < R) {
int mid = L + R + 1 >> 1;
if(check(mid)) L = mid;
else R = mid - 1;
}
cout << L + 1<< '\n';
return 0;
}