1063 - Arme: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == Cerința == Într-un joc video, un jucător trebuie să colecteze arme de diferite tipuri pentru a-și îmbunătăți arsenalul. Fiecare tip de armă are o anumită valoare, iar jucătorul dorește să maximizeze suma valorilor armelor colectate, respectând o limită de greutate pe care o poate transporta. Sarcina ta este să implementezi un program care să determine setul optim de arme pe care jucătorul le poate colecta pentru a maximiza valoarea totală, utilizând o...)
 
 
(Nu s-au afișat 2 versiuni intermediare efectuate de același utilizator)
Linia 1: Linia 1:
== Cerința ==
== Cerința ==
Într-un joc video, un jucător trebuie să colecteze arme de diferite tipuri pentru a-și îmbunătăți arsenalul. Fiecare tip de armă are o anumită valoare, iar jucătorul dorește să maximizeze suma valorilor armelor colectate, respectând o limită de greutate pe care o poate transporta. Sarcina ta este să implementezi un program care să determine setul optim de arme pe care jucătorul le poate colecta pentru a maximiza valoarea totală, utilizând o metodă greedy.
Vasile joacă (din nou!) jocul său preferat cu împuşcături. Personajul său are la brâu N arme, aşezate în N huse speciale, numerotate de la 1 la N. Arma din husa i are puterea pbi (1≤i≤N).
 
În camera armelor a găsit M arme, aşezate pe perete, în M locaţii, numerotate de la 1 la M. Pentru fiecare armă j (1≤j≤M) este cunoscută puterea sa pcj.
 
Vasile poate înlocui arme pe care le are la brâu cu arme aflate pe perete în camera armelor. La o înlocuire el ia arma de pe perete din locaţia j (1≤j≤M) şi o pune la brâu în husa i (1≤i≤N), iar arma din husa i o pune pe perete în locaţia j.
Scrieţi un program care să determine suma maximă a puterilor armelor pe care le va avea la brâu Vasile după efectuarea înlocuirilor.
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură:
Fișierul de intrare arme.in conține pe prima linie numerele naturale N M, reprezentând numărul de arme pe care le are la brâu, respectiv numărul de arme aflate în camera armelor. Pe a doua linie se află N numere naturale pb1 pb2 … pbN reprezentând în ordine puterile armelor pe care Vasile le are la brâu. Pe a treia linie se află M numere naturale pc1 pc2 … pcM reprezentând în ordine puterile armelor aflate în camera armelor. Numerele scrise pe aceeaşi linie sunt separate prin spaţiu.
 
Un număr întreg n reprezentând numărul de tipuri de arme.
O listă de n perechi de numere întregi, fiecare pereche reprezentând greutatea și valoarea unei arme.
Un număr întreg W reprezentând limita de greutate pe care jucătorul o poate transporta.
== Date de ieșire ==
== Date de ieșire ==
Pe ecran se va afișa valoarea totală maximă a armelor pe care jucătorul le poate colecta, respectând limita de greutate.
Fișierul de ieșire arme.out va conține o singură linie pe care va fi scrisă suma maximă a puterilor armelor de la brâul lui Vasile, după efectuarea înlocuirilor.
== Restricții și precizări ==
== Restricții și precizări ==
*1 ⩽ '''n''' ⩽ 100
*1 ≤ N, M ≤ 1000
*1 ⩽ '''w''' ⩽ 1000
*Puterile armelor sunt numere naturale ≤ 10.000.
* Greutatea și valoarea fiecărei arme sunt numere întregi pozitive
* Greutatea și valoarea fiecărei arme sunt numere întregi pozitive
== Exemplu 1 ==
== Exemplu 1 ==
;Intrare
;Intrare
4<br>
3 2<br>
2 3<br>
3 1 7<br>
3 4<br>
4 5
4 5<br>
5 6<br>
5


;Iesire
;Iesire
7
16
== Exemplu 2 ==
;Intrare
3<br>
1 1<br>
3 4<br>
4 5<br>
5
 
;Iesire
6
 


== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def citeste_date():
def main():
     try:
     with open("arme.in", "r") as f:
        n = int(input("Introduceți numărul de tipuri de arme (n): "))
         # Citim dimensiunile N și M
         arme = []
         N, M = map(int, f.readline().strip().split())
         for _ in range(n):
       
            greutate, valoare = map(int, input().strip().split())
        # Citim puterile armelor de la brâu
            arme.append((greutate, valoare))
         puteri_brau = list(map(int, f.readline().strip().split()))
         W = int(input("Introduceți limita de greutate (W): "))
          
         return n, arme, W
        # Citim puterile armelor din camera armelor
    except ValueError:
         puteri_camera = list(map(int, f.readline().strip().split()))
         return None, None, None


def valideaza_date(n, arme, W):
    # Restricții și precizări
     if not (1 <= n <= 100):
    assert 1 <= N <= 1000, "N trebuie să fie între 1 și 1000"
        return False
     assert 1 <= M <= 1000, "M trebuie să fie între 1 și 1000"
     if not (1 <= W <= 1000):
     assert all(1 <= pb <= 10000 for pb in puteri_brau), "Puterea armelor de la brâu trebuie să fie între 1 și 10000"
        return False
     assert all(1 <= pc <= 10000 for pc in puteri_camera), "Puterea armelor din cameră trebuie să fie între 1 și 10000"
     if not all(isinstance(greutate, int) and isinstance(valoare, int) and greutate > 0 and valoare > 0 for greutate, valoare in arme):
        return False
    return True


def calculeaza_valoare_maxima(n, arme, W):
    # Sortăm puterile armelor de la brâu în ordine crescătoare
     arme.sort(key=lambda x: x[1]/x[0], reverse=True)
     puteri_brau.sort()
    greutate_totala = 0
    valoare_totala = 0


     for greutate, valoare in arme:
    # Sortăm puterile armelor din cameră în ordine descrescătoare
         if greutate_totala + greutate <= W:
    puteri_camera.sort(reverse=True)
             greutate_totala += greutate
 
            valoare_totala += valoare
    # Înlocuim armele de la brâu cu cele din cameră
     for i in range(min(N, M)):
         if puteri_camera[i] > puteri_brau[i]:
             puteri_brau[i] = puteri_camera[i]
         else:
         else:
             break
             break


     return valoare_totala
     # Calculăm suma maximă a puterilor armelor de la brâu
    suma_maxima = sum(puteri_brau)


def main():
     with open("arme.out", "w") as f:
     n, arme, W = citeste_date()
         f.write(f"{suma_maxima}\n")
   
    if n is None or arme is None or W is None or not valideaza_date(n, arme, W):
         print("Datele de intrare nu corespund restricțiilor impuse.")
        return
   
    print("Datele de intrare corespund restricțiilor impuse.")
    valoare_maxima = calculeaza_valoare_maxima(n, arme, W)
    print(valoare_maxima)


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()


</syntaxhighlight>
</syntaxhighlight>

Versiunea curentă din 3 iunie 2024 00:01

Cerința

Vasile joacă (din nou!) jocul său preferat cu împuşcături. Personajul său are la brâu N arme, aşezate în N huse speciale, numerotate de la 1 la N. Arma din husa i are puterea pbi (1≤i≤N).

În camera armelor a găsit M arme, aşezate pe perete, în M locaţii, numerotate de la 1 la M. Pentru fiecare armă j (1≤j≤M) este cunoscută puterea sa pcj.

Vasile poate înlocui arme pe care le are la brâu cu arme aflate pe perete în camera armelor. La o înlocuire el ia arma de pe perete din locaţia j (1≤j≤M) şi o pune la brâu în husa i (1≤i≤N), iar arma din husa i o pune pe perete în locaţia j. Scrieţi un program care să determine suma maximă a puterilor armelor pe care le va avea la brâu Vasile după efectuarea înlocuirilor.

Date de intrare

Fișierul de intrare arme.in conține pe prima linie numerele naturale N M, reprezentând numărul de arme pe care le are la brâu, respectiv numărul de arme aflate în camera armelor. Pe a doua linie se află N numere naturale pb1 pb2 … pbN reprezentând în ordine puterile armelor pe care Vasile le are la brâu. Pe a treia linie se află M numere naturale pc1 pc2 … pcM reprezentând în ordine puterile armelor aflate în camera armelor. Numerele scrise pe aceeaşi linie sunt separate prin spaţiu.

Date de ieșire

Fișierul de ieșire arme.out va conține o singură linie pe care va fi scrisă suma maximă a puterilor armelor de la brâul lui Vasile, după efectuarea înlocuirilor.

Restricții și precizări

  • 1 ≤ N, M ≤ 1000
  • Puterile armelor sunt numere naturale ≤ 10.000.
  • Greutatea și valoarea fiecărei arme sunt numere întregi pozitive

Exemplu 1

Intrare

3 2
3 1 7
4 5

Iesire

16

Rezolvare

def main():
    with open("arme.in", "r") as f:
        # Citim dimensiunile N și M
        N, M = map(int, f.readline().strip().split())
        
        # Citim puterile armelor de la brâu
        puteri_brau = list(map(int, f.readline().strip().split()))
        
        # Citim puterile armelor din camera armelor
        puteri_camera = list(map(int, f.readline().strip().split()))

    # Restricții și precizări
    assert 1 <= N <= 1000, "N trebuie să fie între 1 și 1000"
    assert 1 <= M <= 1000, "M trebuie să fie între 1 și 1000"
    assert all(1 <= pb <= 10000 for pb in puteri_brau), "Puterea armelor de la brâu trebuie să fie între 1 și 10000"
    assert all(1 <= pc <= 10000 for pc in puteri_camera), "Puterea armelor din cameră trebuie să fie între 1 și 10000"

    # Sortăm puterile armelor de la brâu în ordine crescătoare
    puteri_brau.sort()

    # Sortăm puterile armelor din cameră în ordine descrescătoare
    puteri_camera.sort(reverse=True)

    # Înlocuim armele de la brâu cu cele din cameră
    for i in range(min(N, M)):
        if puteri_camera[i] > puteri_brau[i]:
            puteri_brau[i] = puteri_camera[i]
        else:
            break

    # Calculăm suma maximă a puterilor armelor de la brâu
    suma_maxima = sum(puteri_brau)

    with open("arme.out", "w") as f:
        f.write(f"{suma_maxima}\n")

if __name__ == "__main__":
    main()