Так Ви хочете стати 2^n-ером?#1577

Так Ви хочете стати 2^n-ером? (Розбір)

Нехай f(n, a) — максимально можливе значення очікуваного виграшу, якщо гравцю належить відповісти на питань, а початкова сума дорівнює .

Якщо n = 0, гравець залишається з початковою сумою, тобто f(0, a) = a.

Ймовірність правильної відповіді дорівнює , де t \le p \le 1. Якщо гравець відповідає правильно на перше питання, йому залишається n - 1 питань, а призова сума подвоюється і стає рівною . З ймовірністю 1 - p дається неправильна відповідь, і вся сума пропадає. Отже, очікуваний виграш після першого питання дорівнює

p \cdot f(n - 1, 2a) + (1 - p) \cdot 0 = p \cdot f(n - 1, 2a)

Якщо це значення перевищує поточну суму , то вигідно продовжити гру; інакше — слід зупинитися. Таким чином, очікуваний виграш після рішення про продовження дорівнює

max(a, p \cdot f(n - 1, 2a))

Оскільки ймовірність рівномірно розподілена на відрізку , то

f(n, a) = \frac{1}{1 - t} \int_{t}^{1} max(a, p \cdot f(n - 1, 2a))\,dp

Якщо t = 1, то ймовірність правильної відповіді дорівнює одиниці, і тоді гравець повинен відповідати на всі питань, отримуючи підсумковий виграш 2^n.

Приклад

Розглянемо третій тест, у якому n = 2, t = 0.6. Початковий капітал a = 1.

f(2, 1) = \frac{1}{0.4} \int_{0.6}^{1} max(1, p \cdot f(1, 2))~dp, \\ f(1, 2) = \frac{1}{0.4} \int_{0.6}^{1} max(2, p \cdot f(0, 4))~dp, \\ f(0, 4) = 4

Обчислимо значення f(1, 2) через f(0, 4):

f(1, 2) = \frac{1}{0.4} \int_{0.6}^{1} max(2, p \cdot f(0, 4))~dp = 2.5 \cdot \int_{0.6}^{1} max(2, 4p)~dp = \\ / враховуємо, що~4p > 2~при~0.6 \le p \le 1 / \\ 2.5 \cdot \int_{0.6}^{1} 4p~dp = 2.5 \cdot \left[ 2 p^2 \right]_{0.6}^{1} = \\ 5 \cdot (1 - 0.36) = 5 \cdot 0.64 = 3.2

Обчислимо значення f(2, 1) через f(1, 2):

f(2, 1) = \frac{1}{0.4} \int_{0.6}^{1} max(1, p \cdot f(1, 2))~dp = 2.5 \cdot \int_{0.6}^{1} max(1, 3.2p)~dp = \\ / враховуємо, що~3.2p > 1~при~0.6 \le p \le 1 / \\ 2.5 \cdot \int_{0.6}^{1} 3.2p~dp = 2.5 \cdot \left[ 1.6 p^2 \right]_{0.6}^{1} = \\ 4 \cdot (1 - 0.36) = 4 \cdot 0.64 = 2.56

Реалізація алгоритму

Функція integral обчислює значення інтеграла

I(a, k) = \frac{1}{1 - t} \int_{t}^{1} max(a, kp)\,dp

для заданих дійсних чисел і . При t = 1 ймовірність вгадування дорівнює одиниці, тому значення інтеграла I(a, k) покладається рівним max(a, k).

Нижче показана область, площа якої дорівнює значенню інтеграла \int_{t}^{1} max(a, kp)\,dp:

Знайдемо точку перетину прямих y = a і y = kp:

a = kp,~ звідки~p = a/k

Покладемо temp = a / k. Значення інтеграла \int_{t}^{1} max(a, kp)\,dp розглянемо як суму \int_{t}^{temp} a\,dp + \int_{temp}^{1} kp\,dp. Залежно від положення точки відносно точок та обчислюємо значення інтеграла I(a, k).

a \cdot (temp - t) + k \cdot (1 - temp \cdot temp) / 2
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 рекурсивно обчислює значення f(n, a) = \begin{cases} I(a, f(n - 1, 2a)), n > 0 \\ a, n = 0 \end{cases}.

double f(int n, int a)
{
  if (!n) return a;
  double k = f(n - 1,2 * a);
  return integral(a,k);
}

Основний цикл програми. Читаємо вхідні дані та виводимо значення f(n, 1).

while(scanf("%d %lf",&n,&t),n + t)
  printf("%.3lf\n",f(n,1));