SDNUOJ1518

Description
超超是个吃货,有一天,她来到了神奇的魔法谷,这里有一条单行道路, 超超为了吃到世界上最美味的食物,必须要穿过这条道路。
这是一个长度为 N 的魔法道路,超超需要从 1 走到 N。每个单位长度上有一个蘑菇,因为超超是个大吃货,所以她总是控制不住自己,必须要吃掉在眼前的食物。但是这些蘑菇受到了魔法的影响,有的可以增加超超的生命,有的可以减少超超的生命。当超超的生命小于 0 时,超超就不能前进, 被召回现实世界了,现在超超希望大家告诉她,她最少需要有多少初始生命值,才能通过这条魔法道路,吃到世界上最美味的食物?
Input
第 1 行:一个数 N,表示魔法道路的长度。(1 <= N <= 50000)
接下来的 N 行,每行一个数 A[i],表示第 i 个单位上有一个魔法蘑菇,可以对超超的生命增加 A[i](如
果 A[i] > 0,表示超超生命增加 A[i],如果 A[i] < 0,表示超超生命减少 A[i])。
其中-1000000000 <= A[i] <= 1000000000。
Output
输出超超通过魔法道路的最小初始生命。
Sample Input
5
1
-2
-1
3
4
Sample Output
2

好几次没过,后来改了改最后if之间的并列关系(使逻辑更清晰),就过了,然而始终没明白原来为什么没过,后来为什么过了…

AC代码(向量vector版)

#include<bits/stdc++.h>
using namespace std;

int main()
{
    long long n;
    while(~scanf("%lld",&n))
    {
        if(n <= 0)
        {
            cout << '0' << '\n';
            continue;
        }
        vector<int> vec;
        vec.clear();
        for(int i = 0; i < n; i++)
        {
            long long a;
            cin >> a;
            vec.push_back(a);
        }
        for(vector<int>::iterator b = vec.end() - 1; b >= vec.begin(); b--)
        {
//            cout << *b << '\n';
            if(*b >= 0)
            {
                vec.pop_back();
                continue;
            }
            if(*b < 0)
            {
                break;
            }
        }
        long long ini = 0;
        long long spare = 0;
        for(int i = 0; i < vec.size(); i++)
        {
//            cout << vec[i] << '\n';
            if(vec[i] < 0)
            {
                if(vec[i] + spare < 0)
                {
                    ini += abs(vec[i]) - spare;
                    spare = 0;
                    continue;
                }
                if(vec[i] + spare >= 0)
                {
                    spare -= abs(vec[i]);
                    continue;
                }
            }
            if(vec[i] >= 0)
            {
                spare += vec[i];
            }

        }
        cout << ini << '\n';
    }
    return 0;
}

WA代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
    long long n;
    while(~scanf("%lld",&n))
    {
        if(n <= 0)
        {
            cout << '0' << '\n';
            continue;
        }
        vector<int> vec;
        vec.clear();
        for(int i = 0; i < n; i++)
        {
            long long a;
            cin >> a;
            vec.push_back(a);
        }
        for(vector<int>::iterator b = vec.end() - 1; b >= vec.begin(); b--)
        {
//            cout << *b << '\n';
            if(*b >= 0)
            {
                vec.pop_back();
                continue;
            }
            if(*b < 0)
            {
                break;
            }
        }
        long long c = 0;
        for(int i = 0; i < vec.size(); i++)
        {
//            cout << vec[i] << '\n';
            c += vec[i];
        }
        if(c >= 0)
            cout << '0' << '\n';
        else
            cout << -1*c << '\n';
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaobaole2018/article/details/84671801