Submission #235398

#TimeUsernameProblemLanguageResultExecution timeMemory
235398dooweyHolding (COCI20_holding)C++14
0 / 110
19 ms2688 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair #define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N = 105; const int S = N * (N + 1); const int M = S/2; const int inf = (int)1e9; int dp[2][N][S]; // pick i items, indice sum j int st[N][S]; int ri[N][S]; int a[N]; void upd(int &a, int b){ a = min(a, b); } int main(){ fastIO; int n, l, r, k; cin >> n >> l >> r >> k; for(int i = 0 ; i <= n; i ++ ){ for(int j = 0 ; j < S; j ++ ){ dp[0][i][j] = dp[1][i][j] = inf; } } dp[0][0][M]=0; int ans = 0; for(int i = 1; i <= n; i ++ ){ cin >> a[i]; if(i >= l && i <= r) ans += a[i]; } for(int i = 1; i <= r; i ++ ){ for(int j = 0 ; j <= n ; j ++ ){ for(int x = 0; x < S ; x ++ ){ if(i < l){ if(dp[0][j][x] == inf) continue; upd(dp[1][j + 1][x - i], dp[0][j][x] + a[i]); upd(dp[1][j][x], dp[0][j][x]); } else{ if(dp[0][j][x] == inf) continue; if(j) upd(dp[1][j - 1][x + i], dp[0][j][x]); upd(dp[1][j][x], dp[0][j][x] + a[i]); } } } for(int j = 0 ; j <= n ; j ++ ){ for(int x = 0; x < S; x ++ ){ dp[0][j][x]=dp[1][j][x]; dp[1][j][x]=inf; } } for(int x = 0; x < S; x ++ ){ st[i][x]=dp[0][0][x]; } } for(int i = 0 ; i <= n; i ++ ){ for(int j = 0 ; j < S; j ++ ){ dp[0][i][j] = dp[1][i][j] = inf; } } dp[0][0][M]=0; for(int i = n; i >= l ; i -- ){ for(int j = 0 ; j <= n; j ++ ){ for(int x = 0; x < S; x ++ ){ if(dp[0][j][x] == inf) continue; if(i > r){ upd(dp[1][j + 1][x + i], dp[0][j][x] + a[i]); upd(dp[1][j][x], dp[0][j][x]); } else{ if(j) upd(dp[1][j - 1][x - i], dp[0][j][x]); upd(dp[1][j][x], dp[0][j][x] + a[i]); } } } for(int j = 0 ; j <= n ; j ++ ){ for(int x = 0; x < S; x ++ ){ dp[0][j][x]=dp[1][j][x]; dp[1][j][x]=inf; } } for(int x = 0 ;x < S; x ++ ){ ri[i][x]=dp[0][0][x]; if(x) upd(ri[i][x],ri[i][x-1]); } } for(int x = 0 ; x <= k ; x ++ ){ upd(ans, st[r][x + M]); upd(ans, ri[l][x + M]); } for(int i = l; i + 1 <= r; i ++ ){ for(int x = 0; x <= k ; x ++ ){ upd(ans, st[i][x + M] + ri[i + 1][k - x + M]); } } cout << ans << "\n"; 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...