Xorvatiya sahilindəki otellər#10682

Xorvatiya sahilindəki otellər (Həll təhlili)

Otel qiymətlərini massivində saxlayırıq. aralığını yaxşı adlandıracağıq, əgər bu aralıqdakı otel qiymətlərinin cəmi -dən çox olmazsa.

Sürüşən pəncərə metodunu iki indeks və ilə həyata keçirək və bu pəncərəni dəstəkləyək ki, mövcud nəzərdən keçirilən interval yaxşı olsun. - aralığındakı otel qiymətlərinin cəmi olsun. Əgər s + a[j + 1] \le m, onda mövcud aralığı a[i ... j + 1]-ə qədər genişləndiririk. Əks halda onu a[i + 1 ... j] aralığına qədər qısaldırıq. Bütün nəzərdən keçirilən yaxşı aralıqlar arasında maksimum qiyməti tapırıq.

Nümunə

Verilən nümunə üçün göstəricilərin hərəkətini nəzərdən keçirək.

  1. i = 0, j qarşıya hərəkət edir, aralıqdakı ədədlərinin cəmi m = 12-dən çox olmayana qədər. aralığında dayanırıq, çünki bu aralıqdakı cəm -a bərabərdir, aralığındakı cəm isə -dir.

  2. i = 1, j irəlilədə bilmirik, çünki aralığının cəmi -ə bərabərdir.

  3. i = 2, j aralığına qədər irəliləyirik.

Bütün yaxşı aralıqlar arasında maksimum dəyər -dir və bu aralığında əldə edilir.

Alqoritmin tətbiqi

Giriş məlumatlarını oxuyuruq.

scanf("%d %lld", &n, &m);

Dəyişənləri eyniləşdiririk:

s = res = 0;

Otel qiymətlərini ardıcıl emal edirik.

for (i = 0; i < n; i++)
{

Mövcud otelin qiymətini oxuyuruq və növbəyə əlavə edirik.

  scanf("%d", &val);
  q.push(val);

Aralıqdakı cəmini yeniləyirik. Mövcud aralıqdakı bütün elementlər növbəsindədir.

  s += val;

Əgər mövcud aralıqdakı ədədlərin cəmi daha çoxdursa, aralığın başlanğıcındakı elementləri silirik.

  while (s > m)
  {
    s -= q.front();
    q.pop();
  }

-dən yüksək olmayan aralıqlardakı elementlərin cəmi arasında maksimum dəyərini hesablayırıq.

  if (s > res) res = s;
}

Cavabı çıxırıq.

printf("%lld\n", res);

Python tətbiqi

Növbəni elan edək.

from collections import deque
q = deque()

Giriş məlumatlarını oxuyuruq.

n, m = map(int, input().split())
costs = list(map(int, input().split()))

Dəyişənləri eyniləşdiririk:

res = s = 0

Otel qiymətlərini ardıcıl emal edirik.

for val in costs:

Mövcud otelin qiymətini növbəyə əlavə edirik.

  q.append(val)

Aralıqdakı cəmini yeniləyirik. Mövcud aralıqdakı bütün elementlər növbəsindədir.

  s += val

Əgər mövcud aralıqdakı ədədlərin cəmi daha çoxdursa, aralığın başlanğıcındakı elementləri silirik.

  while s > m:
    s -= q.popleft()

-dən yüksək olmayan aralıqlardakı elementlərin cəmi arasında maksimum dəyərini hesablayırıq.

  if s > res: res = s

Cavabı çıxırıq.

print(res)