1063 - Arme

From Bitnami MediaWiki
Revision as of 19:01, 2 June 2024 by Benzar Ioan (talk | contribs) (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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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.

Date de intrare

Programul citește de la tastatură:

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

Pe ecran se va afișa valoarea totală maximă a armelor pe care jucătorul le poate colecta, respectând limita de greutate.

Restricții și precizări

  • 1 ⩽ n ⩽ 100
  • 1 ⩽ w ⩽ 1000
  • Greutatea și valoarea fiecărei arme sunt numere întregi pozitive

Exemplu 1

Intrare

4
2 3
3 4
4 5
5 6
5

Iesire

7

Exemplu 2

Intrare

3
1 1
3 4
4 5
5

Iesire

6


Rezolvare

<syntaxhighlight lang="python" line> def citeste_date():

   try:
       n = int(input("Introduceți numărul de tipuri de arme (n): "))
       arme = []
       for _ in range(n):
           greutate, valoare = map(int, input().strip().split())
           arme.append((greutate, valoare))
       W = int(input("Introduceți limita de greutate (W): "))
       return n, arme, W
   except ValueError:
       return None, None, None

def valideaza_date(n, arme, W):

   if not (1 <= n <= 100):
       return False
   if not (1 <= W <= 1000):
       return False
   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):

   arme.sort(key=lambda x: x[1]/x[0], reverse=True)
   greutate_totala = 0
   valoare_totala = 0
   for greutate, valoare in arme:
       if greutate_totala + greutate <= W:
           greutate_totala += greutate
           valoare_totala += valoare
       else:
           break
   return valoare_totala

def main():

   n, arme, W = citeste_date()
   
   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__":

   main()

</syntaxhighlight>