Codeforces 1405B #668Div2B

题目

在这里插入图片描述

题解

两个变量:

  1. 记录正数和:初始化为0,碰到正数时添加该正数;碰到负数时与之求和,若和为正数,继续进行,若和为负数,变量置为0,并将所得结果添加到负数和。
  2. 记录负数和。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>

using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
typedef pair<int, int> P;

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    int T;
    scanf("%d", &T);
    while (T--) {
        ll p = 0, q = 0;
        ll t;
        int n;
        scanf("%d", &n);
        rep(i, 1, n) {
            scanf("%lld", &t);
            if (t > 0) {
                p += t;
            } else if (t < 0) {
                if (p == 0) q += t;
                else if (p + t > 0) p += t;
                else if (p + t <= 0) {
                    q += (p + t);
                    p = 0;
                }
            }
        }
        printf("%lld\n", -q);
    }
    return 0;
}

题外

刚开始想的比较复杂:先将所有连续的正数加起来,再将所有连续的负数加起来,然后寻找正数,并与其之后的负数进行求和。循环进行该步骤直到只剩下两个数字或者0。即得到答案。
实现过程中碰到了很多问题,之后发现并不需要这么麻烦,两个变量就可以解决,再来看当时的思路,真是——没睡醒啊hhhh。

猜你喜欢

转载自blog.csdn.net/qq_45934120/article/details/108449244
今日推荐