Submission #1213560

#TimeUsernameProblemLanguageResultExecution timeMemory
1213560dajeffFeast (NOI19_feast)C++20
100 / 100
293 ms14516 KiB
/*
5 2
1 -10 1 -10 1
*/

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, k;
    cin >> n >> k;
    
    ll a[n];
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    
    long double l = 0, r = 1e18, m, dp[n + 1][2];
    int cnt[n + 1][2];
    for (;;) {
        m = (l + r) / 2;
        
        bool b = false;
		if (r - l <= 1e-6) {
			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...