51nod 1344 走格子

有编号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
4
Output示例
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;
}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值