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;
}