Gəlir#2585

Gəlir (Həll təhlili)

Məsələdə, verilmiş bütün ardıcıl sıralanmış ədədlər arasında maksimum cəmi olan bir alt ardıcıllığı tapmaq lazımdır. Əgər x_i, x_{i+1}, ..., x_j alt ardıcıllığında maksimum cəm əldə edilərsə, o zaman hər hansı k, 1 \le k < i və l, j < l \le n üçün x_k, ..., x_{i-1} və x_{j+1}, ..., x_l ədədlərinin cəmi mənfi olacaqdır.

Kadanın Alqoritmi. Massivdə soldan sağa doğru hərəkət edirik və dəyişənində cari hissə cəmini toplayırıq. S hər hansı bir anda mənfi olarsa, onu s = 0 olaraq təyin edirik. Massiv üzrə keçid zamanı dəyişəninin bütün qiymətlərinin maksimumu məsələnin cavabı olacaqdır.

Misal

Giriş ardıcıllığı üçün maksimum gəlir -ə bərabərdir.

Misal ardıcıllığını nəzərdən keçirək. Hissə cəmləri qururuq. Cari hissə cəmi mənfi olduqda cəm sıfırlayırıq və növbəti ədəddən etibarən cəmi hesablamağa başlayırıq. Bütün hissə cəmləri içində maksimum qiymət -ya bərabərdir ki, bu da cavabdır. Axtarılan alt ardıcıllıq 4, -2, 4 olacaqdır.

Alqoritmin Təminatı

Ardıcıllığın uzunluğunu oxuyuruq. Maksimum gəlirin və cari hissə cəminin qiymətini sıfırlayırıq.

scanf("%d",&n);
s = 0; max = 0;

ədəd oxuyuruq. Hər oxunan ədədini cari cəm -ə əlavə edirik və cari gəlirin qiymətini yenidən hesablayırıq. Əgər hər hansı bir addımda dəyəri mənfiyə çevrilərsə, onu sıfır olaraq təyin edirik və prosesi davam etdiririk.

for(i = 0; i < n; i++)
{
  scanf("%d",&Number);
  s += Number;
  if (s > max) max = s;
  if (s < 0) s = 0;
}

Nəticəni çıxara bilirik.

printf("%d\n",max);

Java Təminatı

import java.util.*;

public class Main
{
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    int n = con.nextInt();

    int s = 0, max = 0;
    for (int i = 0; i < n; i++)
    {
      int val = con.nextInt();
      s += val;
      if (s > max) max = s;
      if (s < 0) s = 0;
    }
    
    System.out.println(max);
    con.close();
  }
}

Python Təminatı

Ardıcıllığın uzunluğunu oxuyuruq. Maksimum gəlirin max\_profit və cari hissə cəminin qiymətini sıfırlayırıq.

n = int(input())
s = 0
max_profit = 0

ədəd oxuyuruq. Hər oxunan ədədini cari cəm -ə əlavə edirik və cari gəlirin max\_profit qiymətini yenidən hesablayırıq. Əgər hər hansı bir addımda dəyəri mənfiyə çevrilərsə, onu sıfır olaraq təyin edirik və prosesi davam etdiririk.

for i in range(n):
  Number = int(input())
  s += Number
  if s > max_profit: max_profit = s
  if s < 0: s = 0

Nəticəni çıxara bilirik.

print(max_profit)