Submission #1131611

#TimeUsernameProblemLanguageResultExecution timeMemory
1131611sunflowerHolding (COCI20_holding)C++17
110 / 110
783 ms8420 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define MASK(x) (1LL << (x))
#define BIT(x, i) (((x) >> (i)) & 1)
#define SZ(x) ((int) (x).size())
#define ALL(a) (a).begin(), (a).end()
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for (int i = (a); i >= (b); --i)

#define left    __left
#define right   __right
#define prev    __prev
#define fi      first
#define se      second

template <class X, class Y>
    bool maximize(X &x, Y y) {
        if (x < y) return x = y, true;
        else return false;
    }

template <class X, class Y>
    bool minimize(X &x, Y y) {
        if (x > y) return x = y, true;
        else return false;
    }

int N, L, R, money;

const int inf = (int) 1e9 + 7;
const long long INF = (long long) 1e18 + 7;

#define MAX_N 102
int a[MAX_N + 2];

namespace subtask1 {
    bool check() {
        return (N <= 13 && R == N);
    }

    void solve() {
        ll ans = 0;
        FOR(i, L, R) ans += 1LL * a[i];

        ll sumCostBase = ans;

        FOR(mask, 0,  MASK(N) - 1) {
            int numBit = __builtin_popcount(mask);
            if (numBit & 1) continue;

            int sumIdPrev = 0, sumCostPrev = 0;
            int sumIdCur  = 0, sumCostCur  = 0;

            int numIdPrev = 0;
            FOR(i, 0, N - 1) if (BIT(mask, i)) {
                int id = i + 1;
                if (id < L) {
                    ++numIdPrev;
                    sumIdPrev += id;
                    sumCostPrev += 1LL * a[id];
                } else {
                    sumIdCur += id;
                    sumCostCur += 1LL * a[id];
                }
            }

            if (numIdPrev != numBit / 2) continue;

            if (sumIdCur - sumIdPrev <= money)
                minimize(ans, sumCostBase + sumCostPrev - sumCostCur);
        }

        cout << ans;
    }
}

namespace subtask4 {

    int dp[2][10'002][102];
    // debug;
    // chua can toi 10'000; ma ~ n^2 ma thoi;

    void solve() {
        memset(dp, 0x3f, sizeof(dp));

        dp[(L - 1) & 1][0][0] = 0;
        a[0] = inf;
        FOR(i, L, R) { // N <=> R;
            memset(dp[i & 1], 0x3f, sizeof(dp[i & 1]));

            FOR(prevUse, 0, money) {
                FOR(nxtID, 0, N) {
                    if (L <= nxtID && nxtID <= R) continue;

                    // khong lam gi ca;
                    minimize(dp[i & 1][prevUse][nxtID], dp[(i - 1) & 1][prevUse][nxtID] + a[i]);

                    // co lam;
                    FOR(prevID, 0, nxtID - 1) {
                        if (L <= prevID && prevID <= R) continue;

                        if (prevUse + abs(i - nxtID) <= money) {
                            minimize(dp[i & 1][prevUse + abs(i - nxtID)][nxtID], dp[(i - 1) & 1][prevUse][prevID] + a[nxtID]);
                        }
                    }
                }
            }
        }

        ll ans = 0;
        FOR(i, L, R) ans += 1LL * a[i];

        FOR(use, 0, money) FOR(id, 0, N) {
            minimize(ans, dp[R & 1][use][id]);
        }

        cout << ans;
    }
}

int main() {
    ios_base::sync_with_stdio(false);cin.tie(nullptr);
    // freopen("holding.inp","r",stdin);
    // freopen("holding.out","w",stdout);
    cin >> N >> L >> R >> money;
    FOR(i, 1, N) cin >> a[i];

    subtask4 :: solve();

    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...