/*
5 2
1 -10 1 -10 1
*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, k;
cin >> n >> k;
ll a[n];
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
double l = 0, r = 1e18, m, dp[n + 1][2];
int cnt[n + 1][2];
while (r - l > 1e-12) {
m = (l + r) / 2;
dp[0][0] = 0;
dp[0][1] = -1e18;
cnt[0][0] = cnt[0][1] = 0;
for (int i = 0; i < n; ++i) {
if (dp[i][0] < dp[i][1]) {
dp[i + 1][0] = dp[i][1];
cnt[i + 1][0] = cnt[i][1];
} else {
dp[i + 1][0] = dp[i][0];
cnt[i + 1][0] = cnt[i][0];
}
double dp0 = dp[i][0] - m, dp1 = dp[i][1];
if (dp0 < dp1) {
dp[i + 1][1] = dp1 + a[i];
cnt[i + 1][1] = cnt[i][1];
} else {
dp[i + 1][1] = dp0 + a[i];
cnt[i + 1][1] = cnt[i][0] + 1;
}
}
// cout << "cnt: " << (dp[n][0] < dp[n][1] ? cnt[n][1] : cnt[n][0]) << endl;
if ((dp[n][0] < dp[n][1] ? cnt[n][1] : cnt[n][0]) <= k) {
r = m;
} else {
l = m;
}
// cout << "lamb: " << m << endl;
}
cout << static_cast<ll>(round(dp[n][0] < dp[n][1] ? dp[n][1] + m * cnt[n][1] : dp[n][0] + m * cnt[n][0])) << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |