Il lancio dei dadi#11753

Il lancio dei dadi (Editoriale)

Valore atteso di un dado. Un dado con facce mostra ciascuna faccia 1, 2, ..., s con probabilità , quindi il suo valore atteso è uguale alla media aritmetica di questi numeri:

E = \frac{1 + 2 + ... + s}{s} = \frac{1+s}{2}.

Il valore atteso di una somma è uguale alla somma dei valori attesi, quindi per i punti di Alice e i punti di Bob

E[A] = \frac{(a_1 + 1)+ ... + (a_m + 1)}{2},~~~E[B] = \frac{(b_1 + 1) + ... + (b_n + 1)}{2}

I punti sono distribuiti simmetricamente rispetto al valore atteso. Su un singolo dado, i valori e , e s - 1 e così via compaiono con la stessa probabilità, cioè il dado è simmetrico rispetto a (1 + s) / 2. La somma di variabili simmetriche è anch'essa simmetrica — rispetto al proprio valore atteso.

Alice vince quando E[A] > E[B], Bob vince quando E[A] < E[B]. Quindi:

p_a > p_b ⇔ E[A] > E[B] ⇔ \\ a_1 + a_2 + ... + a_m + m > b_1 + b_2 + ... +b_n + n.

Per risolvere il problema è sufficiente confrontare le somme SA = \sum a_k + m e SB = \sum b_k + n.

Esempio

Alice ha otto dadi con facce, mentre Bob ha un dado con facce. Allora SA = 8 \cdot 4 + 8 = 40 e SB = 6 + 1 = 7, quindi SA > SB e la risposta è ALICE.

Verifichiamolo direttamente. La somma minima che Alice può ottenere è 8 \cdot 1 = 8, mentre la somma massima di Bob è . Perciò Alice vince indipendentemente dal risultato dei lanci: p_a = 1, p_b = 0.

Consideriamo il secondo test. Alice ha dadi con e facce, Bob ha dadi con e facce. Allora SA = 6 + 4 + 2 = 12 e SB = 4 + 6 + 2 = 12, quindi SA = SB e la risposta è TIED.

Questo si vede anche senza calcoli: Alice e Bob hanno gli stessi insiemi di dadi, cambia solo l'ordine in cui vengono elencati. Perciò i loro punteggi sono distribuiti allo stesso modo, e p_a = p_b.

Implementazione dell'algoritmo

Leggiamo i dati di input. Accumuliamo la somma \sum a_k + m nella variabile , e la somma \sum b_k + n nella variabile .

scanf("%d %d", &m, &n);
sA = m;  sB = n;
for (i = 0; i < m; i++)
{
  scanf("%d", &x);
  sA += x;
}

for (i = 0; i < n; i++)
{
  scanf("%d", &x);
  sB += x;
}

Confrontiamo le somme e stampiamo la risposta.

if (sA > sB)
  puts("ALICE");
else if (sA < sB)
  puts("BOB");
else
  puts("TIED");