Tanrım! Məni xilas et#1575

Tanrım! Məni xilas et (Həll təhlili)

Gözlənilan vaxtını təyin edək, hansı ki təhlukəsiz yerə otağı tərk etmək imkanını verir. Bu vaxt aşağıdakı kimi ifadə edilir:

P = \sum_{i=1}^n p_i \cdot t_i,

burada t_i — i-ci qapını seçdikdə təhlukəsiz yerə çıxma vaxtıdır. Aydındır ki, t_i = x_i əgər x_i > 0; əgər x_i < 0, tərk etmək üçün əvvəlcə -x_i vaxtını otağa qayıtmağa sərf etməli və sonra çıxışa yenidən cəhd üçün vaxtını sərf etməli. Amma, bu halda t_i = -x_i + P.

Nəticədə isə üçün xətti tənlik əldə edirik. Bu tənliyi qurmaq və həll etmək vaxt aparır, burada — qapıların sayıdır.

Nümunə

Birinci testi nəzərdən keçirək:

P = 0.33 * 2 + 0.33 * (3 + P) + 0.34 * (5 + P),

buradan 0.33 \cdot P = 3.35 və ya P = 10.151515.

Alqoritmin realizasiyası

Xətti tənliyin həllini aşağıdakı kimi aparacağıq. çarpanını ehtiva edən bütün elementləri sol tərəfə keçiririk və onların əmsallarını dəyişənində saxlayırıq. Bütün sabitlər sağ tərəfdə toplanır və dəyişənində saxlanılır. İlkin olaraq left = 1 və right = 0 olaraq təyin edirik.

Oxuyuruq cüt ədədi və .

left = 1.0; right = 0.0;
scanf("%d",&n);
for(j = 0; j < n; j++)
{
  scanf("%lf %lf",&x, &p);
  if (x < 0.0)
  {
    left -= p;
    right += p * (-x);
  } else
      right += x * p;
}

Nəticədə left \cdot P = right tənlik alırıq. Əgər left = 0, otağı tərk etmək mümkün deyil (təhlukəsiz yerə aparan qapı yoxdur). Əks halda, axtarılan vaxt P = right / left kimi hesablanır.

if (left > 0.0)
{
  res = right / left;

Cavabı təqdim edirik. dəyişənilə testin nömrəsi uyğun gəlir.

  printf("Case %d: %.2lf\n",i,res);
} else
  printf("Case %d: God! Save me\n",i);