1063 - Arme

From Bitnami MediaWiki
Revision as of 00:00, 3 June 2024 by Benzar Ioan (talk | contribs)

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

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


</syntaxhighlight>