穿过街道所需的最低初始能量
给定一个包含正数和负数的数组。该数组表示从街道一端到另一端的检查点。正值和负值表示该检查点的能量量。正数增加能量,负数减少。找到穿过街道所需的最小初始能量,使得能量水平永远不会变为 0 或小于 0。
注意:即使我们成功过马路,并且在任何检查点没有将能量损失到小于等于 0,所需的最小初始能量的值也将为 1。初始检查点需要 1。
例子 :
Input : arr[] = {4, -10, 4, 4, 4}
Output: 7
Suppose initially we have energy = 0, now at 1st
checkpoint, we get 4. At 2nd checkpoint, energy gets
reduced by -10 so we have 4 + (-10) = -6 but at any
checkpoint value of energy can not less than equals
to 0. So initial energy must be at least 7 because
having 7 as initial energy value at 1st checkpoint
our energy will be = 7+4 = 11 and then we can cross
2nd checkpoint successfully. Now after 2nd checkpoint,
all checkpoint have positive value so we can cross
street successfully with 7 initial energy.
Input : arr[] = {3, 5, 2, 6, 1}
Output: 1
We need at least 1 initial energy to reach first
checkpoint
Input : arr[] = {-1, -5, -9}
Output: 16
我们取初始最小能量 0 即; initMinEnergy = 0 和任何检查点的能量为 currEnergy = 0。现在线性遍历每个检查点并在每个 i'th 检查点添加能量水平,即; currEnergy = currEnergy + arr[i]。如果 currEnergy 变为非正数,那么我们至少需要“abs(currEnergy) + 1”额外的初始能量才能越过这一点。因此我们更新 initMinEnergy = (initMinEnergy + abs(currEnergy) + 1)。我们还更新了 currEnergy = 1,因为我们现在拥有下一个点所需的额外最小初始能量。
下面是上述想法的实现。
C++
// C++ program to find minimum initial energy to
// reach end
#include
using namespace std;
// Function to calculate minimum initial energy
// arr[] stores energy at each checkpoints on street
int minInitialEnergy(int arr[], int n)
{
// initMinEnergy is variable to store minimum initial
// energy required.
int initMinEnergy = 0;
// currEnergy is variable to store current value of
// energy at i'th checkpoint on street
int currEnergy = 0;
// flag to check if we have successfully crossed the
// street without any energy loss <= o at any checkpoint
bool flag = 0;
// Traverse each check point linearly
for (int i=0; i
Java
// Java program to find minimum
// initial energy to reach end
class GFG {
// Function to calculate minimum
// initial energy arr[] stores energy
// at each checkpoints on street
static int minInitialEnergy(int arr[], int n)
{
// initMinEnergy is variable to store
// minimum initial energy required.
int initMinEnergy = 0;
// currEnergy is variable to store
// current value of energy at
// i'th checkpoint on street
int currEnergy = 0;
// flag to check if we have successfully
// crossed the street without any energy
// loss <= o at any checkpoint
boolean flag = false;
// Traverse each check point linearly
for (int i = 0; i < n; i++) {
currEnergy += arr[i];
// If current energy, becomes negative or 0,
// increment initial minimum energy by the negative
// value plus 1. to keep current energy
// positive (at least 1). Also
// update current energy and flag.
if (currEnergy <= 0) {
initMinEnergy += Math.abs(currEnergy) + 1;
currEnergy = 1;
flag = true;
}
}
// If energy never became negative or 0, then
// return 1. Else return computed initMinEnergy
return (flag == false) ? 1 : initMinEnergy;
}
// Driver code
public static void main(String[] args)
{
int arr[] = {4, -10, 4, 4, 4};
int n = arr.length;
System.out.print(minInitialEnergy(arr, n));
}
}
// This code is contributed by Anant Agarwal.
Python3
# Python program to find minimum initial energy to
# reach end
# Function to calculate minimum initial energy
# arr[] stores energy at each checkpoints on street
def minInitialEnergy(arr):
n = len(arr)
# initMinEnergy is variable to store minimum initial
# energy required
initMinEnergy = 0;
# currEnergy is variable to store current value of
# energy at i'th checkpoint on street
currEnergy = 0
# flag to check if we have successfully crossed the
# street without any energy loss <= 0 at any checkpoint
flag = 0
# Traverse each check point linearly
for i in range(n):
currEnergy += arr[i]
# If current energy, becomes negative or 0, increment
# initial minimum energy by the negative value plus 1.
# to keep current energy positive (at least 1). Also
# update current energy and flag.
if currEnergy <= 0 :
initMinEnergy += (abs(currEnergy) +1)
currEnergy = 1
flag = 1
# If energy never became negative or 0, then
# return 1. Else return computed initMinEnergy
return 1 if flag == 0 else initMinEnergy
# Driver program to test above function
arr = [4, -10 , 4, 4, 4]
print (minInitialEnergy(arr))
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)
C#
// C# program to find minimum
// C# program to find minimum
// initial energy to reach end
using System;
class GFG {
// Function to calculate minimum
// initial energy arr[] stores energy
// at each checkpoints on street
static int minInitialEnergy(int []arr, int n)
{
// initMinEnergy is variable to store
// minimum initial energy required.
int initMinEnergy = 0;
// currEnergy is variable to store
// current value of energy at
// i'th checkpoint on street
int currEnergy = 0;
// flag to check if we have successfully
// crossed the street without any energy
// loss <= o at any checkpoint
bool flag = false;
// Traverse each check point linearly
for (int i = 0; i < n; i++) {
currEnergy += arr[i];
// If current energy, becomes negative or 0,
// negativeincrement initial minimum energy
// by the value plus 1. to keep current
// energy positive (at least 1). Also
// update current energy and flag.
if (currEnergy <= 0)
{
initMinEnergy += Math.Abs(currEnergy) + 1;
currEnergy = 1;
flag = true;
}
}
// If energy never became negative
// or 0, then return 1. Else return
// computed initMinEnergy
return (flag == false) ? 1 : initMinEnergy;
}
// Driver code
public static void Main()
{
int []arr = {4, -10, 4, 4, 4};
int n = arr.Length;
Console.Write(minInitialEnergy(arr, n));
}
}
// This code is contributed by Nitin Mittal.
PHP
Javascript
输出 :
7
时间复杂度: O(n)
辅助空间: O(1)