Güman edək ki, — bütün a_i-lər arasında ən böyük qiymətdir. Aydındır ki, dəqiqə ərzində bütün paltarlar heç bir radiator istifadə etmədən öz-özünə quruyacaq.
Cavabın olduğunu fərz edək. Bu o deməkdir ki, -dən az su olan bütün paltarlar öz-özünə quruyacaq. Amma -dən çox su olan paltarları radiatorun köməyi ilə qurudmaq lazımdır.
Fərz edək ki, hər bir paltar, radiator üzərində olub-olmamasından asılı olmayaraq, hər dəqiqədə bir vahid su itirir. Əgər paltarı radiatora qoyarıqsa, o əlavə olaraq k - 1 vahid su itirir, yəni ümumilikdə vahid su itirir.
Əgər paltarların hamısını qurumaq üçün dəqiqə kifayət edirsə, onda hər bir a_i > m paltarı əlavə olaraq radiatorun köməyi ilə qurumağa ehtiyac var. Bu, a_i - m vahid suyun təbii yolla buxarlanmağa çatmayacağı mənasına gəlir. Bir dəqiqə ərzində radiator əlavə olaraq (k - 1) vahid su çıxarır, buna görə də belə bir paltar üçün
radiator müddəti lazım olacaq.
Radiorun ümumi istifadə müddəti \displaystyle \sum_{i=1}^n \lceil (a_i - m) / (k - 1) \rceil m qədər çox olmamalıdır, çünki hər dəqiqədə yalnız bir paltarı qurutmaq mümkündür. Cəmi a_i > m olan indekslər üzrə götürülür.
Beləliklə, yoxlama belə edilməlidir: əgər verilmiş üçün ümumi lazım olan radiator dəqiqələri -dən azdırsa, bu vaxt dəyəri uyğundur. Ən kiçik uyğun dəyərini binary search ilə axtarırıq.
Misal
Başlanğıcda suda olan üç paltar var (2, 3, 9).
Birinci dəqiqədə üçüncü paltarı radiatora qoyuruq. Beləliklə, bu vəziyyəti əldə edirik: (1, 2, 4).
İkinci dəqiqədə yenidən üçüncü paltarı radiatora qoyuruq. Vəziyyət (0, 1, 0) olur.
Üçüncü dəqiqədə ikinci paltar özü quruyur. Son vəziyyət: (0, 0, 0).
m = 2 dəyərini nəzərdən keçirək. Bu zaman vahiddən az su olan bütün paltarlar öz-özünə quruyacaq.
Qalanlar üçün radiatorun köməyi ilə qurumaq lazımdır. İkinci paltarda vahid su var, buna görə radiatorun köməyi ilə 3 - 2 = 1 vahid suyu çıxarmaq lazımdır.
Üçüncü paltarda vahid su olduğundan, radiator ilə 9 - 2 = 7 vahid suyu çıxarmaq lazımdır.
Bunun üçün \lceil 1/4 \rceil + \lceil 7/4 \rceil = 3 dəqiqə lazım olacaq. Bu, m = 2-dən çoxdur. Deməli, iki dəqiqə kifayət etmir.
Alqoritmin həyata keçirilməsi
İş massivi elan edək.
#define MAX 100001
int a[MAX];Giriş məlumatlarını oxuyuruq.
scanf("%d",&n);
for(i = 0; i < n; i++) scanf("%d",&a[i]);
scanf("%d",&k);dəqiqə ərzində bütün paltarlar, radiator istifadə edilmədən belə, quruyacaq.
l = 0; r = *max_element(a,a+n);Əgər k \le 1-dirsə, radiator ilə quruma təbii quruma ilə eynidir və radiatorun heç bir üstünlüyü yoxdur.
if (k <= 1)
{
printf("%d\n",r); return 0;
}Axtarılan minimal dəqiqə miqdarı m [l; r] intervallı üzərində binary search ilə tapıla bilər.
while (r - l > 1)
{
m = (r + l) / 2;dəyişəni radiatorun istifadəsi üçün lazım olan ümumi dəqiqələrin sayını toplayır. Bu zaman dəqiqə ərzində bütün paltarları qurumaq lazımdır.
dry = 0;
for (i = 0; i < n; i++)
{
if (a[i] > m)
dry += (a[i] - m + k - 2) / (k - 1);
if (dry > m) break;
}
if (dry > m) l = m; else r = m;
}Cavabı çap edirik.
printf("%d\n",r);