Submission #821612

#TimeUsernameProblemLanguageResultExecution timeMemory
821612LittleCubeLet's Win the Election (JOI22_ho_t3)C++17
100 / 100
696 ms2252 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;

ll N, K, mxC;
double ans = 1e15, dp[505][505], res[505];
pll A[505];

double calc(int i)
{
    for (int k = i; k >= 0; k--)
        for (int l = K - i; l >= 0; l--)
            dp[k][l] = 1e15;
    dp[0][0] = 0;
    for (int j = 1; j <= N; j++)
        for (int k = i; k >= 0; k--)
            for (int l = K - i; l >= 0; l--)
            {
                if (k > 0)
                    dp[k][l] = min(dp[k][l], dp[k - 1][l] + double(A[j].S) / double(k));
                if (l > 0)
                    dp[k][l] = min(dp[k][l], dp[k][l - 1] + double(A[j].F) / double(i + 1));
            }
    return dp[i][K - i];
}

signed main()
{
    cin >> N >> K;
    mxC = N;
    for (int i = 1; i <= N; i++)
    {
        cin >> A[i].F >> A[i].S;
        if (A[i].S == -1)
            mxC--, A[i].S = 1e15;
    }
    sort(A + 1, A + 1 + N, [&](pll p1, pll p2)
         { return pll{p1.S, p1.F} < pll{p2.S, p2.F}; });
    int L = 0, R = min(K, mxC);
    int lmid = floor(L * 0.618 + R * 0.382), rmid = floor(L * 0.382 + R * 0.618);
    while (R - L > 9)
    {

        double lans = calc(lmid), rans = calc(rmid);
        if (lans <= rans)
        {
            R = rmid;
            rmid = lmid;
            lmid = floor(L * 0.618 + R * 0.382);
        }
        else
        {
            L = lmid;
            lmid = rmid;
            rmid = floor(L * 0.382 + R * 0.618);
        }
    }
    for (int i = L; i <= R; i++)
        ans = min(ans, calc(i));
    cout << fixed << setprecision(10) << ans << '\n';
}
#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...