n天,银行卡上限金额d元,任何时刻卡内金额超过d时即输出-1。每天早可向卡内充入任意金额,之后会有数字,正数使卡内金额增加,负数代表支出,为0时需检查银行卡,此时不允许卡内金额为负。求最少的向卡内充钱的次数。
先检查是否会超过额度,在确保不超过时,每次我们在检查时如果卡内金额为负,就在当天早把金额调整为d。之后的操作如果金额超过d,说明之前钱充多了,此时把钱调整为d就行了。
#include <map> #include <cstdio> #include <cstring> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; typedef long long LL; const int maxn = 1e5 + 10; int A[maxn]; int n, d; int main() { scanf("%d%d", &n, &d); for (int i = 0; i < n; i++) { scanf("%d", &A[i]); } int ans = 0; int sum = 0; bool flag = 1; for (int i = 0; i < n && flag; i++) { sum += A[i]; if (!A[i] && sum < 0) sum = 0; if (sum > d) { flag = 0; } } if (flag) { sum = 0; for (int i = 0; i < n; i++) { sum += A[i]; if (sum > d) { sum = d; } if (!A[i] && sum < 0) { ans++; sum = d; } } printf("%d ", ans); } else { puts("-1"); } return 0; }