Submission #1270990

#TimeUsernameProblemLanguageResultExecution timeMemory
1270990quangminh412Feast (NOI19_feast)C++17
100 / 100
606 ms20388 KiB
/*
  Ben Watson

  Quang Minh MasterDDDDD
*/

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ldb long double

const string name = "test";

void solve();
signed main()
{
    if (fopen((name + ".inp").c_str(), "r"))
    {
        freopen((name + ".inp").c_str(), "r", stdin);
        freopen((name + ".out").c_str(), "w", stdout);
    }
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    solve();

    return 0;
}

// main program
const int maxn = 3e5 + 1;

int a[maxn];
int n, k;

pair<ldb, int> compute(ldb pen)
{
    pair<ldb, int> dp[2][n + 1];
    dp[0][1] = {0, 0};
    dp[1][1] = {a[1] - pen, 1};
    for (int i = 2; i <= n; i++)
    {
        dp[0][i] = max(dp[0][i - 1], dp[1][i - 1]);
        pair<ldb, int> c1, c2;
        c1 = make_pair(dp[0][i - 1].first + a[i] - pen, dp[0][i - 1].second + 1);
        c2 = make_pair(dp[1][i - 1].first + a[i], dp[1][i - 1].second);
        dp[1][i] = max(c1, c2);
    }
    return max(dp[0][n], dp[1][n]);
}

void solve()
{
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    ldb l = 0, r = 3e14;
    for (int i = 0; i < 100; i++)
    {
        ldb mid = (l + r) / 2;
        if (compute(mid).second < k)
            r = mid;
        else
            l = mid;
    }

    ldb pen = l;
    cout << (ll)round(pen * k + compute(pen).first) << '\n';
}

Compilation message (stderr)

feast.cpp: In function 'int main()':
feast.cpp:20:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |         freopen((name + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
feast.cpp:21:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |         freopen((name + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...