1590 - Arma 1: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunț == În anul 2214 a izbucnit primul război interstelar. Pământul a fost atacat de către '''n''' civilizaţii extraterestre, pe care le vom numerota pentru simplicitate de la '''1''' la '''n'''. Pentru a se apăra, pământenii au inventat o armă specială ce poate fi încărcată cu proiectile de diferite greutăţi, fabricate dintr-un material special denumit narun. Dacă arma este programată la nivelul '''p''', atunci un proiectil de greutate '''k''' va ajun...
 
Line 12: Line 12:
Fișierul de intrare '''arma1.in''' conține pe prima linie un număr natural '''c''' reprezentând cerinţa care trebuie să fie rezolvată ('''1''' sau '''2'''). Pe cea de a doua linie se află numărul natural '''n''', reprezentând numărul atacatorilor. Pe următoarele n linii se află n numere naturale, câte un număr pe o linie; pe cea de a '''i'''-a linie dintre cele n ('''1≤i≤n''') se află distanţa faţă de Pământ a cartierului general al celei de a '''i'''-a civilizaţii extraterestre.
Fișierul de intrare '''arma1.in''' conține pe prima linie un număr natural '''c''' reprezentând cerinţa care trebuie să fie rezolvată ('''1''' sau '''2'''). Pe cea de a doua linie se află numărul natural '''n''', reprezentând numărul atacatorilor. Pe următoarele n linii se află n numere naturale, câte un număr pe o linie; pe cea de a '''i'''-a linie dintre cele n ('''1≤i≤n''') se află distanţa faţă de Pământ a cartierului general al celei de a '''i'''-a civilizaţii extraterestre.
== Date de ieşire ==
== Date de ieşire ==
Dacă cerinţa '''c=1''', atunci pe prima linie a fişierului '''arma1.out''' va fi scris un număr natural reprezentând cantitatea minimă de narun necesară distrugerii tuturor cartierelor generale inamice.
Dacă datele sunt introduse corect,în fișier se va afișa :'''"Datele sunt introduse corect."''',apoi dacă cerinţa '''c=1''', atunci pe prima linie a fişierului '''arma1.out''' va fi scris un număr natural reprezentând cantitatea minimă de narun necesară distrugerii tuturor cartierelor generale inamice.
Dacă cerinţa este '''c=2''', atunci fişierul de ieşire arma1.out va conţine '''n''' linii. Pe a '''i'''-a linie ('''1≤i≤n''') se va scrie nivelul la care trebuie programată arma pentru a distruge cartierul general al celei de a '''i'''-a civilizaţii extraterestre.
Dacă cerinţa este '''c=2''', atunci fişierul de ieşire arma1.out va conţine '''n''' linii. Pe a '''i'''-a linie ('''1≤i≤n''') se va scrie nivelul la care trebuie programată arma pentru a distruge cartierul general al celei de a '''i'''-a civilizaţii extraterestre.În cazul contrar,se va afișa pe ecran '''"Datele nu corespund restricțiilor impuse."'''.
 
== Restricții și precizări ==
== Restricții și precizări ==
* 1 ⩽ n ⩽ 10.000
* 1 ⩽ n ⩽ 10.000

Revision as of 10:51, 25 April 2023

Enunț

În anul 2214 a izbucnit primul război interstelar. Pământul a fost atacat de către n civilizaţii extraterestre, pe care le vom numerota pentru simplicitate de la 1 la n. Pentru a se apăra, pământenii au inventat o armă specială ce poate fi încărcată cu proiectile de diferite greutăţi, fabricate dintr-un material special denumit narun. Dacă arma este programată la nivelul p, atunci un proiectil de greutate k va ajunge exact la distanţa k**p km (k la puterea p) faţă de Pământ şi dacă în acel punct se află cartierul general al unui atacator, acesta va fi distrus. De exemplu, dacă arma este programată la nivelul 2, un proiectil de greutate 10 va distruge cartierul general al extratereştrilor situat la distanţa 102 = 100 km de Pământ.

Arma poate fi încărcată cu proiectile de diferite greutăţi, dar cum narunul este un material foarte rar şi foarte scump, pământenii vor să folosească proiectile cât mai uşoare pentru a distruge cartierele generale inamice

Cerinţa

Cunoscându-se n, numărul atacatorilor, precum şi cele n distanţe până la cartierele generale ale acestora, să se scrie un program care determină:

cantitatea minimă de narun necesară pentru a distruge toate cartierele generale inamice; nivelurile la care trebuie programată arma, pentru a distruge fiecare cartier general inamic cu o cantitate minimă de narun.

Date de intrare

Fișierul de intrare arma1.in conține pe prima linie un număr natural c reprezentând cerinţa care trebuie să fie rezolvată (1 sau 2). Pe cea de a doua linie se află numărul natural n, reprezentând numărul atacatorilor. Pe următoarele n linii se află n numere naturale, câte un număr pe o linie; pe cea de a i-a linie dintre cele n (1≤i≤n) se află distanţa faţă de Pământ a cartierului general al celei de a i-a civilizaţii extraterestre.

Date de ieşire

Dacă datele sunt introduse corect,în fișier se va afișa :"Datele sunt introduse corect.",apoi dacă cerinţa c=1, atunci pe prima linie a fişierului arma1.out va fi scris un număr natural reprezentând cantitatea minimă de narun necesară distrugerii tuturor cartierelor generale inamice. Dacă cerinţa este c=2, atunci fişierul de ieşire arma1.out va conţine n linii. Pe a i-a linie (1≤i≤n) se va scrie nivelul la care trebuie programată arma pentru a distruge cartierul general al celei de a i-a civilizaţii extraterestre.În cazul contrar,se va afișa pe ecran "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 1 ⩽ n ⩽ 10.000
  • Distanţele până la cartierele generale inamice sunt numere naturale nenule ≤ 2.000.000.000.
  • Pentru 50% dintre teste cerinţa este 1.

Exemplul 1

arma1.in
1
5
100
97
625
40353607
81
arma1.out
Datele introduse corespund restricțiilor impuse.
122


arma1.in
2
5
100
97
625
40353607
81
arma1.out
2
1
4
9
4

Explicație

Primul cartier general se poate distruge cu un proiectil de greutate 10, programat la nivelul 2, al doilea obiectiv cu un proiectil de greutate 97 programat la nivelul 1, al treilea cu un proiectil de greutate 5 programat la nivelul 4, al patrulea cu un proiectil de greutate 7 programat la nivelul 9, iar ultimul cu un proiectil de greutate 3 programat la nivelul 4.

Cantitatea minimă de narun necesară este 10+97+5+7+3=122.

Nivelurile sunt în ordine: 2 1 4 9 4.

Rezolvare

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

   flag = False
   if n.isdigit():
       if 0 <= int(n) <= 2_000_000_000:
           flag = True
   return flag

if __name__ == '__main__':

   with open('arma1.in', 'r') as f:
       cerinta = int(f.readline().strip())
       n = int(f.readline().strip())
       distante = []
       for i in range(n):
           numar = f.readline().strip()
           if validare_date(numar):
               distante.append(int(numar))
           else:
               print("Datele de intrare nu corespund restricțiilor impuse.")
               exit()
   if validare_date(str(cerinta)) and len(distante) == n:
       if cerinta == 1:
           cantitate_narun = 0
           for distanta in distante:
               cantitate_narun += pow(distanta, 3)
           print(cantitate_narun)
       elif cerinta == 2:
           for distanta in distante:
               for p in range(3):
                   if pow(distanta, p) >= distanta:
                       print(p)
                       break
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")


</syntaxhighlight>