1063 - Arme

De la Universitas MediaWiki
Versiunea din 2 iunie 2024 19:01, autor: Benzar Ioan (discuție | contribuții) (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...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

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

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()