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:
Il valore atteso di una somma è uguale alla somma dei valori attesi, quindi per i punti di Alice e i punti di Bob
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:
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");