Sıra#1965

Sıra (Həll təhlili)

Giriş ardıcıllığı artıq azalan sırada çeşidlənmişdir. Petyanın mövqeyini yuxarı sərhəd üzrə ikili axtarışla tapacağıq. Sıralamada mövqelərin nömrələnməsi -dən başlayır.

Alqoritmin implementasiyası

Giriş verilənlərini oxuyuruq. Şagirdlərin boyunu massivinə toplayırıq.

scanf("%d",&n);
v.resize(n);
for(i = 0; i < n; i++)
  scanf("%d",&v[i]);
scanf("%d",&x);

Əgər sırada Petyanın boyuna bərabər boylu şagirdlər varsa, o zaman o, onların arxasında durur. Petyanın mövqeyini tapmaq üçün yuxarı sərhəd üzrə ikili axtarışdan istifadə edirik – bu mümkün, çünki massiv azalan sırada çeşidlənmişdir.

pos = upper_bound(v.begin(),v.end(),x,greater<int>()) - v.begin();

Petyanın mövqeyini çıxarırıq və tapşırıqda şagirdlərin nömrələnməsi birlə başladığına diqqət edirik.

printf("%d\n",pos + 1);

Alqoritmin implementasiyası — öz ikili axtarış

Giriş verilənlərini oxuyuruq. Şagirdlərin boyunu massivinə toplayırıq.

scanf("%d",&n);
v.resize(n+1);
for(i = 1; i <= n; i++)
  scanf("%d",&v[i]);
scanf("%d",&x);

Petya -dən n + 1-ə qədər istənilən mövqeni tuta bilər. İkili axtarış intervalını başladırıq: [Left; Right] = [1; n + 1].

int Left = 1, Right = n + 1, Middle;

İkili axtarışı başladırıq.

while(Left < Right)
{
  Middle = (Left + Right) / 2;
  if (x <= v[Middle]) Left = Middle + 1; else Right = Middle;
}

Cavabı, yəni Petyanın sıradakı mövqeyini çıxarırıq.

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