#include <iostream>
using namespace std;
long iStan[500000], iDroga[500000];
long long iMiasta, iBilans, iMinimum, iAkt;
long szukaj(long start, long long bilans) {
long i, j;
if (start == iMiasta - 1) {
if (iAkt < iMinimum) {
iMinimum = iAkt;
//cout << "minimum=" << iMinimum << endl;
}
return 0;
}
if (iStan[start] < 0 || bilans - iStan[start] < 0) {
if (iAkt + iDroga[start] >= iMinimum) {
return -1;
}
iStan[start + 1] += iStan[start];
iAkt += iDroga[start];
i = szukaj(start + 1, bilans);
iStan[start + 1] -= iStan[start];
iAkt -= iDroga[start];
return i + iDroga[start];
}
iStan[start + 1] += iStan[start];
iAkt += iDroga[start];
i = szukaj(start + 1, bilans);
if (i != -1) i+= iDroga[start];
iStan[start + 1] -= iStan[start];
iAkt -= iDroga[start];
j = szukaj(start + 1, bilans - iDroga[start]);
if (i == -1) return j;
if (j == -1) return i;
return i < j ? i : j;
}
int main()
{
long n, i, x;
cin >> n;
i = 0;
while (i < n) {
cin >> x; i++;
if (x != 0) break;
}
if (i == n) { cout << 0; return 0; }
iMiasta = 1; iDroga[0] = 1; iMinimum = n;
iStan[0] = iBilans = x;
while (i < n) {
cin >> x;
if (x != 0) {
iStan[iMiasta] = x; iDroga[iMiasta++] = 1;
iBilans += x;
}
else iDroga[iMiasta - 1]++;
i++;
}
if (iBilans < 0) { cout << -1; return 0; }
iAkt = 0;
while (iStan[iMiasta - 1] < 0) {
iStan[iMiasta - 2] += iStan[iMiasta - 1];
iAkt += iDroga[iMiasta - 2];
iMiasta--;
}
//for (i = 0; i < iMiasta; i++) { cout << "iDroga[" << i << "]=" << iDroga[i] << " iStan=" << iStan[i] << endl; }
cout << szukaj(0, iBilans) + iAkt;
return 0;
}
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 77 78 79 | #include <iostream> using namespace std; long iStan[500000], iDroga[500000]; long long iMiasta, iBilans, iMinimum, iAkt; long szukaj(long start, long long bilans) { long i, j; if (start == iMiasta - 1) { if (iAkt < iMinimum) { iMinimum = iAkt; //cout << "minimum=" << iMinimum << endl; } return 0; } if (iStan[start] < 0 || bilans - iStan[start] < 0) { if (iAkt + iDroga[start] >= iMinimum) { return -1; } iStan[start + 1] += iStan[start]; iAkt += iDroga[start]; i = szukaj(start + 1, bilans); iStan[start + 1] -= iStan[start]; iAkt -= iDroga[start]; return i + iDroga[start]; } iStan[start + 1] += iStan[start]; iAkt += iDroga[start]; i = szukaj(start + 1, bilans); if (i != -1) i+= iDroga[start]; iStan[start + 1] -= iStan[start]; iAkt -= iDroga[start]; j = szukaj(start + 1, bilans - iDroga[start]); if (i == -1) return j; if (j == -1) return i; return i < j ? i : j; } int main() { long n, i, x; cin >> n; i = 0; while (i < n) { cin >> x; i++; if (x != 0) break; } if (i == n) { cout << 0; return 0; } iMiasta = 1; iDroga[0] = 1; iMinimum = n; iStan[0] = iBilans = x; while (i < n) { cin >> x; if (x != 0) { iStan[iMiasta] = x; iDroga[iMiasta++] = 1; iBilans += x; } else iDroga[iMiasta - 1]++; i++; } if (iBilans < 0) { cout << -1; return 0; } iAkt = 0; while (iStan[iMiasta - 1] < 0) { iStan[iMiasta - 2] += iStan[iMiasta - 1]; iAkt += iDroga[iMiasta - 2]; iMiasta--; } //for (i = 0; i < iMiasta; i++) { cout << "iDroga[" << i << "]=" << iDroga[i] << " iStan=" << iStan[i] << endl; } cout << szukaj(0, iBilans) + iAkt; return 0; } |
English