제출 #1131611

#제출 시각아이디문제언어결과실행 시간메모리
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...