有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去。机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值。如果A[i] > 0,机器人走到这个格子能够获取A[i]个能量,如果A[i]
< 0,走到这个格子需要消耗相应的能量,如果机器人的能量 < 0,就无法继续前进了。问机器人最少需要有多少初始能量,才能完成整个旅程。
例如:n = 5。{1,-2,-1,3,4} 最少需要2个初始能量,才能从1号走到5号格子。途中的能量变化如下3 1 0 3 7。
Input
第1行:1个数n,表示格子的数量。(1 <= n <= 50000) 第2 - n + 1行:每行1个数A[i],表示格子里的能量值(-1000000000 <= A[i] <= 1000000000)
Output
输出1个数,对应从1走到n最少需要多少初始能量。
Input示例
5 1 -2 -1 3 4Output示例
2当走到一个负数的格子时,剩余的能量最小值是这个负数的绝对值,当走到一个非负数的格子时,剩余的能量最小是0,我们要保证走过最后一个负数能量格子后剩余的能量不能小于0
例如:1 -2 -1 3 4
我们从后往前看,当走到3时,剩余能量要大于等于0,当走到-1时,剩余能量要大于1,当走到2时,剩余能量要大于-1格子需要的1加上-2格子需要的2,所以走到2需要的能量为3,当走到正数1格子时,我们知道走到-2格子需要3个能量,但是1格子只能提供1个,所以我们需要的最小初始能量为2.
我们再看,如果第一个格子为3,又如何呢
例如:3 -2 -1 3 4
我们会发现第一个格子可以提供第二个格子需要的3,所以初始能量就不需要了,为0
因此我们可以找到这么一个思路:从后往前找到第一个为负数的格子,最小初始能量ans=这个格子的绝对值,然后向前遍历,如果格子为负数,ans+=格子的绝对值,如果格子为正数,格子能够提供ans需要的值,则ans=0,否则ans=ans-格子的值
#include<iostream>
#define ll long long
using namespace std;
ll A[50005];
int main()
{
int n;
cin>>n;
int i;
for(i=0;i<n;i++)
cin>>A[i];
for(i=n-1;i>=0;i--)
{
if(A[i]<0)
{
break;
}
}
ll ans=0;
for(;i>=0;i--)
{
if(A[i]<0)
ans+=A[i]*(-1);
else
{
if(A[i]>=ans)
ans=0;
else
ans=ans-A[i];
}
}
printf("%lld",ans);
return 0;
}