Codeforces-893D. Credit Card

传送门

 

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\n", ans);
    } else {
        puts("-1");
    }
    return 0;
}

 

posted @ 2018-04-11 16:36  xFANx  阅读(145)  评论(0编辑  收藏  举报