logo

Energia inicial mínima necessària per creuar el carrer

Prova-ho a GfG Practice ' title= #practiceLinkDiv { mostrar: cap !important; }

Donada una matriu que conté nombres positius i negatius. La matriu representa els punts de control d'un extrem a l'altre extrem del carrer. Els valors positius i negatius representen la quantitat d'energia en aquest punt de control. Els nombres positius augmenten l'energia i els negatius disminueixen. Trobeu l'energia inicial mínima necessària per creuar el carrer de manera que el nivell d'energia mai sigui 0 o inferior a 0.

Nota: El valor de l'energia inicial mínima requerida serà 1 encara que creuem el carrer amb èxit sense perdre energia a menys i igual a 0 en qualsevol punt de control. L'1 és necessari per al punt de control inicial.



Exemples:  

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
Recommended Practice Energia mínima Prova-ho!

Enfocament de força bruta:

  • Per a cada nivell d'energia inicial possible (a partir de 1) simuleu l'encreuament del carrer utilitzant aquest nivell d'energia i comproveu si el nivell d'energia continua sent positiu en tot moment.
  • Torna el nivell d'energia inicial mínim que garanteix que el nivell d'energia mai esdevingui zero o negatiu.

A continuació es mostra el codi de l'enfocament anterior:



C++
#include   using namespace std; // Function to check if energy level never becomes negative or zero bool check(int arr[] int n int initEnergy) {  int energy = initEnergy;  for (int i = 0; i < n; i++) {  energy += arr[i];  if (energy <= 0) {  return false;  }  }  return true; } // Function to calculate minimum initial energy // arr[] stores energy at each checkpoints on street int minInitialEnergy(int arr[] int n) {  int minEnergy = 1;  while (!check(arr n minEnergy)) {  minEnergy++;  }  return minEnergy; } // Driver code int main() {  int arr[] = {4 -10 4 4 4};  int n = sizeof(arr)/sizeof(arr[0]);  cout << minInitialEnergy(arr n);  return 0; } 
Java
import java.util.*; public class GFG {  // Function to check if energy level never becomes  // negative or zero  static boolean check(int[] arr int n int initEnergy)  {  int energy = initEnergy;  for (int i = 0; i < n; i++) {  energy += arr[i];  if (energy <= 0) {  return false;  }  }  return true;  }  // Function to calculate minimum initial energy  // arr[] stores energy at each checkpoints on the street  static int minInitialEnergy(int[] arr int n)  {  int minEnergy = 1;  while (!check(arr n minEnergy)) {  minEnergy++;  }  return minEnergy;  }  // Driver code  public static void main(String[] args)  {  int[] arr = { 4 -10 4 4 4 };  int n = arr.length;  System.out.println(minInitialEnergy(arr n));  } } // This code is contributed by akshitaguprzj3 
Python3
# Function to check if energy level never becomes negative or zero def check(arr n initEnergy): energy = initEnergy for i in range(n): energy += arr[i] if energy <= 0: return False return True # Function to calculate minimum initial energy # arr stores energy at each checkpoints on street def minInitialEnergy(arr n): minEnergy = 1 while not check(arr n minEnergy): minEnergy += 1 return minEnergy # Driver code arr = [4 -10 4 4 4] n = len(arr) print(minInitialEnergy(arr n)) # THIS CODE IS CONTRIBUTED BY CHANDAN AGARWAL 
C#
using System; namespace EnergyCheck {  class GFG  {  // Function to check if energy level never becomes negative or zero  static bool Check(int[] arr int n int initEnergy)  {  int energy = initEnergy;  for (int i = 0; i < n; i++)  {  energy += arr[i];  if (energy <= 0)  {  return false;  }  }  return true;  }  // Function to calculate minimum initial energy  // arr[] stores energy at each checkpoints on street  static int MinInitialEnergy(int[] arr int n)  {  int minEnergy = 1;  while (!Check(arr n minEnergy))  {  minEnergy++;  }  return minEnergy;  }  // Driver code  static void Main(string[] args)  {  int[] arr = { 4 -10 4 4 4 };  int n = arr.Length;  Console.WriteLine(MinInitialEnergy(arr n));  }  } } 
JavaScript
// Function to check if energy level never becomes negative or zero function check(arr n initEnergy) {  let energy = initEnergy;  for (let i = 0; i < n; i++) {  energy += arr[i];  if (energy <= 0) {  return false;  }  }  return true; } // Function to calculate minimum initial energy // arr[] stores energy at each checkpoints on street function minInitialEnergy(arr n) {  let minEnergy = 1;  while (!check(arr n minEnergy)) {  minEnergy++;  }  return minEnergy; } // Driver code let arr = [4 -10 4 4 4]; let n = arr.length; console.log(minInitialEnergy(arr n)); 

Sortida:

7  

Complexitat temporal: O(2^n)

Espai auxiliar: O(n)



Prenem l'energia mínima inicial 0, és a dir; initMinEnergy = 0 i energia a qualsevol punt de control com a currEnergy = 0. Ara travessa cada punt de control linealment i afegeix el nivell d'energia a cada punt de control i, és a dir; CurrEnergy = CurrEnergy + arr[i]. Si currEnergy esdevé no positiu, necessitem almenys 'abs(currEnergy) + 1' energia inicial addicional per creuar aquest punt. Per tant, actualitzem initMinEnergy = (initMinEnergy + abs(currEnergy) + 1). També actualitzem currEnergy = 1, ja que ara tenim l'energia inicial mínima addicional necessària per al següent punt.

A continuació es mostra la implementació de la idea anterior. 

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<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 += abs(currEnergy) +1;   currEnergy = 1;   flag = 1;   }   }   // If energy never became negative or 0 then   // return 1. Else return computed initMinEnergy   return (flag == 0)? 1 : initMinEnergy;  }  // Driver Program to test the case  int main()  {   int arr[] = {4 -10 4 4 4};   int n = sizeof(arr)/sizeof(arr[0]);   cout << minInitialEnergy(arr n);   return 0;  }  
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. 
JavaScript
<script> // Javascript program to find minimum // initial energy to reach end // Function to calculate minimum // initial energy arr[] stores // energy at each checkpoints on street function minInitialEnergy(arr n) {  // initMinEnergy is variable  // to store minimum initial  // energy required.  let initMinEnergy = 0;  // currEnergy is variable to  // store current value of energy  // at i'th checkpoint on street  let currEnergy = 0;  // flag to check if we have  // successfully crossed the  // street without any energy  // loss <= o at any checkpoint  let flag = 0;  // Traverse each check  // point linearly  for (let 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 = 1;  }  }  // If energy never became  // negative or 0 then  // return 1. Else return  // computed initMinEnergy  return (flag == 0) ? 1 : initMinEnergy; } // Driver Code let arr = new Array(4 -10 4 4 4); let n = arr.length; document.write(minInitialEnergy(arr n)); // This code is contributed // by Saurabh Jaiswal </script> 
PHP
 // PHP program to find minimum  // initial energy to reach end // Function to calculate minimum  // initial energy arr[] stores  // energy at each checkpoints on street function minInitialEnergy($arr $n) { // 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 <= o at any checkpoint $flag = 0; // Traverse each check // point linearly for ($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 += abs($currEnergy) + 1; $currEnergy = 1; $flag = 1; } } // If energy never became  // negative or 0 then // return 1. Else return  // computed initMinEnergy return ($flag == 0) ? 1 : $initMinEnergy; } // Driver Code $arr = array(4 -10 4 4 4); $n = sizeof($arr); echo minInitialEnergy($arr $n); // This code is contributed  // by nitin mittal.  ?> 

Sortida
7

Complexitat temporal: O(n) 
Espai auxiliar: O(1)