#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 subtask2 {
bool check() {
return (N <= 50 && R == N);
}
int dp[52][10'002][52];
// debug;
// chua can toi 10'000; ma ~ n^2 ma thoi;
void solve() {
// clock_t start = clock();
memset(dp, 0x3f, sizeof(dp));
dp[N + 1][0][0] = 0;
a[0] = inf;
FORD(i, N, L) { // N <=> R;
FOR(prevUse, 0, money) {
FOR(nxtID, 0, L - 1) {
// khong lam gi ca;
minimize(dp[i][prevUse][nxtID], dp[i + 1][prevUse][nxtID] + a[i]);
// co lam;
FOR(prevID, 0, nxtID - 1) {
if (prevUse + i - nxtID <= money) {
minimize(dp[i][prevUse + i - nxtID][nxtID], dp[i + 1][prevUse][prevID] + a[nxtID]);
}
}
}
}
}
ll ans = 0;
FOR(i, L, R) ans += 1LL * a[i];
FOR(use, 0, money) FOR(id, 0, L - 1) {
minimize(ans, dp[L][use][id]);
}
cout << ans;
// cerr << "Time elapsed: " << (double)(clock() - start)/CLOCKS_PER_SEC << " ms\n";
}
}
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];
// if (subtask1 :: check()) return subtask1 :: solve(), 0;
if (subtask2 :: check()) return subtask2 :: solve(), 0;
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... |