f(n, a) ilə oyunçunun suala cavab verməli olduğu və ilkin məbləğin -ya bərabər olduğu halda gözlənilən uduşun maksimum mümkün dəyərini işarə edək.
Əgər n = 0 olarsa, oyunçu ilkin məbləğ ilə qalır, yəni f(0, a) = a.
Düzgün cavab vermə ehtimalı -yə bərabərdir, burada t \le p \le 1. Əgər oyunçu birinci suala düzgün cavab verirsə, ona n - 1 sual qalır, mükafat məbləği isə ikiqat artaraq -ya bərabər olur. 1 - p ehtimalı ilə səhv cavab verilir və bütün məbləğ itir. Deməli, birinci sualdan sonra gözlənilən uduş bərabərdir
Əgər bu dəyər cari məbləğ -dan böyükdürsə, oyuna davam etmək sərfəlidir; əks halda — dayanmaq lazımdır. Beləliklə, davam etmə qərarından sonra gözlənilən uduş bərabərdir
ehtimalı parçası üzərində bərabər paylandığı üçün
Əgər t = 1 olarsa, düzgün cavab vermə ehtimalı vahidə bərabərdir, deməli oyunçu bütün suala cavab verməlidir və nəticədə 2^n uduş əldə edir.
Nümunə
Üçüncü testə baxaq, burada n = 2, t = 0.6. İlkin kapital a = 1.
f(1, 2) dəyərini f(0, 4) vasitəsilə hesablayaq:
f(2, 1) dəyərini f(1, 2) vasitəsilə hesablayaq:
Alqoritmin realizasiyası
integral funksiyası
inteqralının dəyərini verilmiş və həqiqi ədədləri üçün hesablayır. t = 1 olduqda təxmin etmə ehtimalı vahidə bərabərdir, buna görə I(a, k) inteqralının dəyəri max(a, k)-ya bərabər qəbul edilir.
Aşağıda sahəsi \int_{t}^{1} max(a, kp)\,dp inteqralının dəyərinə bərabər olan sahə göstərilib:
y = a və y = kp düz xətlərinin kəsişmə nöqtəsini tapaq:
temp = a / k qəbul edək. \int_{t}^{1} max(a, kp)\,dp inteqralının dəyərinə \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp cəmi kimi baxaq. nöqtəsinin və nöqtələrinə nisbətən vəziyyətindən asılı olaraq I(a, k) inteqralının dəyərini hesablayırıq.
Əgər t \le temp \le 1 olarsa, onda \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp =
Əgər temp \le t olarsa, onda \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp = \int_{t}^{1} kp\,dp = k \cdot (1 - t \cdot t) / 2.
Əgər temp > 1 olarsa, onda \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp = \int_{t}^{1} a\,dp = a \cdot (1 - t).
double integral(double a, double k)
{
double s = 0, temp = a / k;
if (t == 1) return max(a,k);
if (temp > 1) return a * (1 - t);
if (temp >= t) s = a * (temp - t);
else temp = t;
s += k * (1 – temp * temp) / 2;
return s / (1 - t);
}f funksiyası f(n, a) = \begin{cases} I(a, f(n - 1, 2a)), n > 0 \\ a, n = 0 \end{cases} dəyərini rekursiv olaraq hesablayır.
double f(int n, int a)
{
if (!n) return a;
double k = f(n - 1,2 * a);
return integral(a,k);
}Proqramın əsas dövrü. Giriş məlumatlarını oxuyuruq və f(n, 1) dəyərini çap edirik.
while(scanf("%d %lf",&n,&t),n + t)
printf("%.3lf\n",f(n,1));