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.
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.
i = 1, j irəlilədə bilmirik, çünki aralığının cəmi -ə bərabərdir.
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:
-də bütün işlənmiş yaxşı aralıqlardakı qiymətlərin maksimumu hesablanır;
-də mövcud aralığında olan ədədlərin cəmi saxlanılır. Mövcud aralığındakı bütün ədədlər növbəsində saxlanılır;
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:
-də bütün işlənmiş yaxşı aralıqlardakı qiymətlərin maksimumu hesablanır;
-də mövcud aralığında olan ədədlərin cəmi saxlanılır. Mövcud aralığındakı bütün ədədlər növbəsində saxlanılır;
res = s = 0Otel 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 = sCavabı çıxırıq.
print(res)