#include <bits/stdc++.h> #define gc getchar #define gcu getchar_unlocked #define fi first #define se second #define pb push_back #define mod ((ll)1e9 + 7) typedef long long ll; using namespace std; //=============================================================================================== int n, maxi, tempmaxi, mini, ans = INT_MAX; ll dod, uje, temp; pair<int, ll> dp[1000009], tempdp[1000009]; vector<pair<int, int>> v; //=============================================================================================== int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%lld", &temp); if (temp > 0) dod += temp; if (temp < 0) uje -= temp; if (temp) v.pb({temp, i}); } if (uje > dod) { printf("-1\n"); return 0; } maxi = 1; dp[0] = {0, v[0].fi}; for (int i = 1; i < v.size(); i++) { mini = INT_MAX; for (int j = 0; j < maxi; j++) { if (dp[j].se >= 0) mini = min(mini, dp[j].fi); if (j > 1000 && j + 1000 < maxi) continue; if (dp[j].se > 0) { if (dp[j].se) { tempdp[tempmaxi] = {dp[j].fi + v[i].se - v[i - 1].se, dp[j].se + v[i].fi}; tempmaxi++; } } else { tempdp[tempmaxi] = {dp[j].fi + v[i].se - v[i - 1].se, dp[j].se + v[i].fi}; tempmaxi++; } } if (mini != INT_MAX) { tempdp[tempmaxi] = {mini, v[i].fi}; tempmaxi++; } for (int j = 0; j < tempmaxi; j++) dp[j] = tempdp[j]; maxi = tempmaxi; tempmaxi = 0; } for (int i = 0; i < maxi; i++) if (dp[i].se >= 0) ans = min(ans, dp[i].fi); printf("%d\n", ans); } //===============================================================================================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <bits/stdc++.h> #define gc getchar #define gcu getchar_unlocked #define fi first #define se second #define pb push_back #define mod ((ll)1e9 + 7) typedef long long ll; using namespace std; //=============================================================================================== int n, maxi, tempmaxi, mini, ans = INT_MAX; ll dod, uje, temp; pair<int, ll> dp[1000009], tempdp[1000009]; vector<pair<int, int>> v; //=============================================================================================== int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%lld", &temp); if (temp > 0) dod += temp; if (temp < 0) uje -= temp; if (temp) v.pb({temp, i}); } if (uje > dod) { printf("-1\n"); return 0; } maxi = 1; dp[0] = {0, v[0].fi}; for (int i = 1; i < v.size(); i++) { mini = INT_MAX; for (int j = 0; j < maxi; j++) { if (dp[j].se >= 0) mini = min(mini, dp[j].fi); if (j > 1000 && j + 1000 < maxi) continue; if (dp[j].se > 0) { if (dp[j].se) { tempdp[tempmaxi] = {dp[j].fi + v[i].se - v[i - 1].se, dp[j].se + v[i].fi}; tempmaxi++; } } else { tempdp[tempmaxi] = {dp[j].fi + v[i].se - v[i - 1].se, dp[j].se + v[i].fi}; tempmaxi++; } } if (mini != INT_MAX) { tempdp[tempmaxi] = {mini, v[i].fi}; tempmaxi++; } for (int j = 0; j < tempmaxi; j++) dp[j] = tempdp[j]; maxi = tempmaxi; tempmaxi = 0; } for (int i = 0; i < maxi; i++) if (dp[i].se >= 0) ans = min(ans, dp[i].fi); printf("%d\n", ans); } //=============================================================================================== |