Submission #1213559

#TimeUsernameProblemLanguageResultExecution timeMemory
1213559dajeffFeast (NOI19_feast)C++20
100 / 100
819 ms40360 KiB
/*
5 2
1 -10 1 -10 1

5 1
2 -1 2 -10 2

1 1
1000000
*/

#include <bits/stdc++.h>

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

using namespace std;

using ll = long long;

int main() {
//    freopen("input.txt", "r", stdin);

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
//
//    string line;getline(cin, line);
//    cout << line << endl;
//    return 0;
//

    int n, k;
    cin >> n >> k;

//    cout << n << " " << k << endl;
//    return 0;

    vector<ll> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    long double l = 0, r = 1e15, m;
    vector<vector<long double> > dp(n + 1, vector<long double>(2));
    vector<vector<int> > cnt(n + 1, vector<int>(2));
    for (int kk = 0; kk < 200; ++kk) {
        m = (l + r) / 2;

        bool b = false;
        if (r - l <= 1e-15) {
            m = l;
            b = true;
        }

        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];
            }

            long 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;
        }

        if (b) {
            break;
        }

        // cout << "lamb: " << m << endl;
    }

    cout << static_cast<ll>(round(dp[n][0] < dp[n][1] ? dp[n][1] + m * min(cnt[n][1], k) : dp[n][0] + m * min(cnt[n][0], k))) << endl;


    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...