#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |