2357 - escape: Difference between revisions
Pagină nouă: Pentru că toți elevii clasei a VI-a s-au hotărât să meargă la EscapeRoom, diriginta a repartizat fiecărui elev un număr. Fiind mulți elevi, ei vor intra în două serii astfel: dacă numărul primit este prim, atunci elevul intră în '''seria 1''', altfel elevul intră în '''seria 2'''. Numărul camerei în care intră elevul este cifra de control obținută din numărul primit de fiecare elev în parte (cifra de control a unui număr se obține efectuând suma cif... |
No edit summary |
||
Line 41: | Line 41: | ||
=== Lipește codul aici === | === Lipește codul aici === | ||
1 | <syntaxhighlight lang="python" line="1"> | ||
import math | |||
fp = [0] * 10 | |||
f = [0] * 10 | |||
ciur = [0] * 1000001 | |||
d = 0 | |||
cam = [0] * 10 | |||
v = [0] * 10 | |||
x = 0 | |||
j = 0 | |||
y = 0 | |||
punctaj = 0 | |||
pmax1 = 0 | |||
pmax2 = 0 | |||
c = 0 | |||
ciur[0] = 1 | |||
ciur[1] = 1 | |||
for d in range(2, 1001): | |||
for j in range(d * d, 1000001, d): | |||
ciur[j] = 1 | |||
for i in range(1, 10): | |||
v[i] = i | |||
c, n = map(int, input().split()) | |||
for i in range(1, n + 1): | |||
x = int(input()) | |||
punctaj = x % 100 | |||
x = x // 100 | |||
y = x % 9 | |||
if y == 0: | |||
y = 9 | |||
cam[y] += 1 | |||
if ciur[x] == 0: | |||
fp[y] += punctaj | |||
else: | |||
f[y] += punctaj | |||
if c == 1: | |||
for i in range(1, 10): | |||
if fp[i] > pmax1: | |||
pmax1 = fp[i] | |||
for i in range(1, 10): | |||
if f[i] > pmax2: | |||
pmax2 = f[i] | |||
print(pmax1, pmax2) | |||
else: | |||
for i in range(1, 9): | |||
for j in range(i + 1, 10): | |||
if cam[i] < cam[j]: | |||
cam[i], cam[j] = cam[j], cam[i] | |||
v[i], v[j] = v[j], v[i] | |||
elif cam[i] == cam[j] and v[i] > v[j]: | |||
v[i], v[j] = v[j], v[i] | |||
for i in range(1, 10): | |||
if cam[i] != 0: | |||
print(v[i], end=' ') | |||
</syntaxhighlight> | |||
Latest revision as of 13:54, 14 December 2023
Pentru că toți elevii clasei a VI-a s-au hotărât să meargă la EscapeRoom, diriginta a repartizat fiecărui elev un număr. Fiind mulți elevi, ei vor intra în două serii astfel: dacă numărul primit este prim, atunci elevul intră în seria 1, altfel elevul intră în seria 2. Numărul camerei în care intră elevul este cifra de control obținută din numărul primit de fiecare elev în parte (cifra de control a unui număr se obține efectuând suma cifrelor sale, apoi suma cifrelor acestei sume și așa mai departe, până când se obține un număr formată dintr-o singură cifră). În funcție de timpul de evadare, elevul are un punctaj reprezentat de un număr cu exact două cifre. La numărul primit, elevul lipește punctajul obținut și formează un cod pe care la sfârșitul activității îl transmite doamnei diriginte.
Exemplu: elevul primește numărul 191
; numărul este prim, deci elevul va intra în seria 1, iar numărul camerei este 2
(1 + 9 + 1 = 11
, 1 + 1 = 2
); punctajul obținut de elev este 60
, deci codul elevului este 19160
.
Cerința[edit | edit source]
Fiind dat numărul natural n
, reprezentând numărul de elevi și cele n
coduri primite de doamna dirigintă, să se determine:
(1) Punctajul maxim obținut de o cameră în prima serie și punctajul maxim obținut de o cameră în a doua serie (punctajul camerei este egal cu suma punctajelor elevilor care au fost în camera respectivă în aceeași serie).
(2) Indicii camerelor vizitate, în ordinea descrescătoare a numărului de elevi care le-au vizitat, din ambele serii, la un loc.
Date de intrare[edit | edit source]
Fișierul de intrare escape.in
conţine pe prima linie, separate printr-un spațiu, numărul cerinței c
și numărul natural n
, reprezentând numărul de elevi. Pe cea de a doua linie sunt cele n
coduri, separate prin câte un spațiu, coduri formate de fiecare elev, la sfârșitul activității
Date de ieșire[edit | edit source]
Fișierul de ieșire escape.out
va conține
- pentru cerința 1: punctajul maxim obținut de o cameră în seria 1 și punctajul maxim obținut de o cameră în seria 2, separate prin câte un spațiu, pe aceeași linie;
- pentru cerința 2: indicii camerelor vizitate, pe același rând, separate prin câte un spațiu, în ordinea descrescătoare a numărului de elevi care le-au vizitat în ambele serii la un loc; pentru camere vizitate de același număr de elevi, se vor afișa indicii camerelor în ordine crescătoare.
Exemplul 1:[edit | edit source]
escape.in
1 6 10190 1450 100450 1120350 22020 13017
escape.out
90 100
Restricții și precizări[edit | edit source]
1 < n ≤ 1.000.000
100 ≤ codurile ≤ 1.000.000
- pot intra mai mulți elevi în aceeași cameră
- pentru
c = 1
se va rezolva doar cerința 1 și se acordă40
de puncte; pentruc = 2
se va rezolva doar cerința 2 și se acordă50
de puncte; - În concurs s-au acordat
10
puncte din oficiu. Aici se acordă10
puncte pentru exemple.
Explicație[edit | edit source]
Cerința este 1
și avem 6
coduri. În seria 1 este vizitată doar camera 2
și punctajul este 90
; în seria 2 sunt vizitate camerele 4
cu punctaj 37
( 20 + 17
), camera 5
cu punctaj 100
( 50 + 50
) și camera 7
cu punctaj 50
.
Încărcare soluție[edit | edit source]
Lipește codul aici[edit | edit source]
<syntaxhighlight lang="python" line="1"> import math fp = [0] * 10 f = [0] * 10 ciur = [0] * 1000001 d = 0 cam = [0] * 10 v = [0] * 10 x = 0 j = 0 y = 0 punctaj = 0 pmax1 = 0 pmax2 = 0 c = 0 ciur[0] = 1 ciur[1] = 1 for d in range(2, 1001):
for j in range(d * d, 1000001, d): ciur[j] = 1
for i in range(1, 10):
v[i] = i
c, n = map(int, input().split()) for i in range(1, n + 1):
x = int(input()) punctaj = x % 100 x = x // 100 y = x % 9 if y == 0: y = 9 cam[y] += 1 if ciur[x] == 0: fp[y] += punctaj else: f[y] += punctaj
if c == 1:
for i in range(1, 10): if fp[i] > pmax1: pmax1 = fp[i] for i in range(1, 10): if f[i] > pmax2: pmax2 = f[i] print(pmax1, pmax2)
else:
for i in range(1, 9): for j in range(i + 1, 10): if cam[i] < cam[j]: cam[i], cam[j] = cam[j], cam[i] v[i], v[j] = v[j], v[i] elif cam[i] == cam[j] and v[i] > v[j]: v[i], v[j] = v[j], v[i] for i in range(1, 10): if cam[i] != 0: print(v[i], end=' ')
</syntaxhighlight>