1769 - albume: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: Tudoraș are o pasiune pentru muzică. El deține câte K albume din discografia fiecăreia dintre cele C formații pe care le ascultă. În fiecare zi, Tudoraș extrage la întamplare exact Q albume din colecția sa, pe care le ascultă în cursul zilei. <br> La finalul zilei, Tudoraș analizează albumele ascultate. Concret, el numără de la câte formații diferite provin cele Q albume alese și își notează această valoare. <br> Care va fi media aritmetică a valorilo...)
 
Fără descriere a modificării
 
Linia 1: Linia 1:
Tudoraș are o pasiune pentru muzică. El deține câte K albume din discografia fiecăreia dintre cele C formații pe care le ascultă. În fiecare zi, Tudoraș extrage la întamplare exact Q albume din colecția sa, pe care le ascultă în cursul zilei.
Tudoraș are o pasiune pentru muzică. El deține câte <code>K</code> albume din discografia fiecăreia dintre cele <code>C</code> formații pe care le ascultă. În fiecare zi, Tudoraș extrage la întamplare exact <code>Q</code> albume din colecția sa, pe care le ascultă în cursul zilei.
<br>
 
La finalul zilei, Tudoraș analizează albumele ascultate. Concret, el numără de la câte formații diferite provin cele Q albume alese și își notează această valoare.
La finalul zilei, Tudoraș analizează albumele ascultate. Concret, el numără de la câte formații diferite provin cele Q albume alese și își notează această valoare.
<br>
Care va fi media aritmetică a valorilor notate, dacă procesul se repetă pentru un număr infinit de zile?
<br>
Cu alte cuvinte, care este valoarea medie (expected value) a numărului de formații ascultate într-o zi?
== Date de intrare ==
Fișierul albumein.txt conține pe prima linie trei valori separate prin spațiu: C K Q.
== Date de ieșire ==
Fișierul albumeout.txt trebuie să conțină pe prima linie o singură valoare reală: media aritmetică a valorilor notate de Tudoraș.
== Restricții și precizări ==
*'''1 ≤ C, K ≤ 1000'''
*'''1 ≤ Q ≤ min(1000, C*K)'''
*Pentru teste în valoare de 10 puncte, '''K = 1'''.
*Pentru alte teste în valoare de 10 puncte, '''Q = C * K'''.
*Pentru alte teste în valoare de 20 de puncte, '''C * K ≤ 10'''.
*În fiecare zi, toate albumele au probabilitate egală de a fi extrase.
*Rezultatul este considerat corect dacă are o eroare absolută de cel mult 10**-6.
== Exemplu 1 ==
; albumein.txt
: 2 2 2
; albumeout.txt
: 1.666666667
<br>
== Exemplu 2 ==
; albumein.txt
: 232 654 27
; albumeout.txt
: 25.542102567
<br>
== Rezolvare ==
<syntaxhighlight lang="python" line>
#1769 - albume
def calculate_expected_value(C, K, Q):
    expected_value = 0
    for i in range(1, C + 1):
        probability = i / C
        expected_value += probability * min(Q, i * K)


    return expected_value
Care va fi media aritmetică a valorilor notate, dacă procesul se repetă pentru un număr infinit de zile? Cu alte cuvinte, care este valoarea medie (expected value) a numărului de formații ascultate într-o zi?
 
= Date de intrare =
Fișierul <code>albumeIN.txt</code> conține pe prima linie trei valori separate prin spațiu: <code>C K Q</code>.
 
= Date de ieșire =
Fișierul <code>albumeOUT.txt</code> trebuie să conțină pe prima linie o singură valoare reală: media aritmetică a valorilor notate de Tudoraș. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
 
= Restricții și precizări =


def check_restrictions(C, K, Q):
* <code>1 ≤ C, K ≤ 1000</code>
    if not (1 <= C <= 1000):
* <code>1 Q min(1000, C*K)</code>
        return False
* Pentru teste în valoare de 10 puncte, <code>K = 1</code>.
    if not (1 <= K <= 1000):
* Pentru alte teste în valoare de 10 puncte, <code>Q = C * K</code>.
        return False
* Pentru alte teste în valoare de 20 de puncte, <code>C * K ≤ 10</code>.
    if not (1 <= Q <= min(1000, C * K)):
* În fiecare zi, toate albumele au probabilitate egală de a fi extrase.
        return False
* Rezultatul este considerat corect dacă are o eroare absolută de cel mult <code>10-6</code>.
    if K != 1 and Q == C * K:
        return False
    if C * K > 10:
        return False
    return True


def main():
= Exemplul 1 =
    # Citirea datelor de intrare
<code>albumeIN.txt</code>
    with open('albumein.txt', 'r') as file:
2 2 2
        C, K, Q = map(int, file.readline().split())
<code>albumeOUT.txt</code>
1.666666667


    # Verificare restricții
= Exemplul 2 =
    if not check_restrictions(C, K, Q):
<code>albumeIN.txt</code>
        print("false")
232 654 27 
        return
<code>albumeOUT.txt</code>
25.542102567 


    # Calculul valorii așteptate (expected value)
== Rezolvare ==
     result = calculate_expected_value(C, K, Q)
<syntaxhighlight lang="python" line="1">
def verifica_restrictii(c, k, q):
     if 1 <= c <= 1000 and 1 <= k <= 1000 and 1 <= q <= min(1000, c * k):
        return True
    return False


     # Scrierea rezultatului în fișierul de ieșire
def main():
    with open('albumeout.txt', 'w') as file:
     try:
         file.write('{:.6f}'.format(result))
        with open("albumeIN.txt", "r") as fin:
            c, k, q = map(int, fin.readline().split())
       
        if not verifica_restrictii(c, k, q):
            with open("albumeOUT.txt", "w") as fout:
                fout.write("Datele nu corespund restrictiilor impuse")
            return
          
        a = 1.0
        for i in range(q):
            a *= (k * (c - 1.0) - i) / (k * c - i)
       
        rezultat = (1.0 - a) * c
        with open("albumeOUT.txt", "w") as fout:
            fout.write(f"{rezultat:.9f}")
    except Exception as e:
        with open("albumeOUT.txt", "w") as fout:
            fout.write(f"Eroare: {str(e)}")


if __name__ == "__main__":
if __name__ == "__main__":
Linia 75: Linia 65:


</syntaxhighlight>
</syntaxhighlight>
== Explicatie ==
În primul exemplu, există două formații, fiecare cu două albume. Numerotăm albumele în următorul fel:
*a1 = 1 (primul album al primei formații)
*a2 = 1 (al doilea album al primei formații)
*a3 = 2 (primul album al celei de-a doua formații)
*a4 = 2 (al doilea album al celei de-a doua formații)
Suma numărului de formații din fiecare caz este egală cu '''1+2+2+1+2+2+2+2+1+2+2+1 = 20'''.
<br>
Cele 12 cazuri au probabilitate egală de a se întâmpla.
<br>
Rezultatul este '''20 / 12 = 1.(6)'''

Versiunea curentă din 18 mai 2024 14:40

Tudoraș are o pasiune pentru muzică. El deține câte K albume din discografia fiecăreia dintre cele C formații pe care le ascultă. În fiecare zi, Tudoraș extrage la întamplare exact Q albume din colecția sa, pe care le ascultă în cursul zilei.

La finalul zilei, Tudoraș analizează albumele ascultate. Concret, el numără de la câte formații diferite provin cele Q albume alese și își notează această valoare.

Care va fi media aritmetică a valorilor notate, dacă procesul se repetă pentru un număr infinit de zile? Cu alte cuvinte, care este valoarea medie (expected value) a numărului de formații ascultate într-o zi?

Date de intrare

Fișierul albumeIN.txt conține pe prima linie trei valori separate prin spațiu: C K Q.

Date de ieșire

Fișierul albumeOUT.txt trebuie să conțină pe prima linie o singură valoare reală: media aritmetică a valorilor notate de Tudoraș. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări

  • 1 ≤ C, K ≤ 1000
  • 1 ≤ Q ≤ min(1000, C*K)
  • Pentru teste în valoare de 10 puncte, K = 1.
  • Pentru alte teste în valoare de 10 puncte, Q = C * K.
  • Pentru alte teste în valoare de 20 de puncte, C * K ≤ 10.
  • În fiecare zi, toate albumele au probabilitate egală de a fi extrase.
  • Rezultatul este considerat corect dacă are o eroare absolută de cel mult 10-6.

Exemplul 1

albumeIN.txt

2 2 2

albumeOUT.txt

1.666666667

Exemplul 2

albumeIN.txt

232 654 27 

albumeOUT.txt

25.542102567 

Rezolvare

def verifica_restrictii(c, k, q):
    if 1 <= c <= 1000 and 1 <= k <= 1000 and 1 <= q <= min(1000, c * k):
        return True
    return False

def main():
    try:
        with open("albumeIN.txt", "r") as fin:
            c, k, q = map(int, fin.readline().split())
        
        if not verifica_restrictii(c, k, q):
            with open("albumeOUT.txt", "w") as fout:
                fout.write("Datele nu corespund restrictiilor impuse")
            return
        
        a = 1.0
        for i in range(q):
            a *= (k * (c - 1.0) - i) / (k * c - i)
        
        rezultat = (1.0 - a) * c
        with open("albumeOUT.txt", "w") as fout:
            fout.write(f"{rezultat:.9f}")
    except Exception as e:
        with open("albumeOUT.txt", "w") as fout:
            fout.write(f"Eroare: {str(e)}")

if __name__ == "__main__":
    main()