2733 - nrapp: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Cerința== Se dă un număr natural '''N''' si un șir '''v''' de '''N''' numere naturale. Sa se răspundă la '''Q''' întrebări de tipul: '''D y''': Care este cea mai mică poziție '''x''', unde '''x''' > '''y''', pentru care '''v[x] < v[y]'''? Dacă nu există o astfel de poziție, răspunsul acestei întrebări va fi '''N + 1'''. '''S y''': Care este cea mai mare poziție '''x''', unde '''x''' < '''y''', pentru care '''v[x] < v[y]'''? Dacă nu există o astfel de po...
 
No edit summary
 
Line 8: Line 8:
==Date de intrare==
==Date de intrare==


Fișierul de intrare '''nrapp.in''' conține pe prima linie numărul natural '''N''', iar pe a doua linie '''N''' numere naturale separate prin spații. A treia linie va conține numărul natural nenul '''Q''' și apoi '''Q''' întrebări precum cele descrise anterior.
Fișierul de intrare '''nrappin.txt''' conține pe prima linie numărul natural '''N''', iar pe a doua linie '''N''' numere naturale separate prin spații. A treia linie va conține numărul natural nenul '''Q''' și apoi '''Q''' întrebări precum cele descrise anterior.


==Date de ieșire==
==Date de ieșire==


Fișierul de ieșire '''nrapp.out''' va conține '''Q''' linii, anume răspunsul pentru fiecare întrebare în parte.
Fișierul de ieșire '''nrappout.txt''' va conține '''Q''' linii, anume răspunsul pentru fiecare întrebare în parte.


==Restricții și precizări==
==Restricții și precizări==
Line 19: Line 19:
*'''1 ≤ v[i] ≤ 1.000.000'''
*'''1 ≤ v[i] ≤ 1.000.000'''


==Exemplu:==
==Exemplul 1:==


;nrapp.in
;nrappin.txt


:8
8
:1 3 6 5 2 1 9 6
1 3 6 5 2 1 9 6
:8
8
:S 1
S 1
:D 2
D 2
:D 3
D 3
:S 4
S 4
:S 5
S 5
:D 6
D 6
:D 7
D 7
:D 8
D 8


;nrapp.out
;nrappout.txt


:0
Datele de intrare corespund restrictiilor impuse
:5
0
:4
5
:2
4
:1
2
:9
1
:8
9
:9
8
9
 
==Exemplul 2:==
 
;nrappin.txt
 
nrapp
 
;nrappout.txt
 
Datele de intrare nu corespund restrictiilor impuse


==Rezolvare==
==Rezolvare==
Line 50: Line 61:
<syntaxhighlight lang="python" line="1" start="1">
<syntaxhighlight lang="python" line="1" start="1">


# Functia solve care rezolva problema
def validare(n, sir_v, q, intrebari, file_output):           # functia de validare a datelor de intrare
def solve(N, v, Q, queries):
     if not 1 <= n <= 100000:
    # Initializam lista de raspunsuri
        raise ValueError
     answers = []
     for val in sir_v:
     # Parcurgem fiecare interogare
        if not 1 <= val <= 1000000:    # fiecare element trebuie sa fie numar intreg intre 1 si 1.000.000
     for query in queries:
            raise ValueError
         # Daca interogarea este de tip 'D'
    if q < 1:
         if query[0] == 'D':
        raise ValueError
             y = query[1]
     for intrebare in intrebari:
             # Initializam raspunsul cu N + 1
         if len(intrebare) != 2 or not isinstance(intrebare[1], int):
            answer = N + 1
            raise ValueError
            # Cautam cea mai mica pozitie x > y pentru care v[x] < v[y]
    file_output.write("Datele de intrare corespund restrictiilor impuse\n")
             for x in range(y + 1, N + 1):
 
                 if v[x - 1] < v[y - 1]:
 
                     answer = x
def solve(n, sir_v, intrebari):                    # functia de rezolvare
    raspunsuri = []
    for intrebare in intrebari:
         if intrebare[0] == 'D':
             y = intrebare[1]
             raspuns = n + 1
             for x in range(y + 1, n + 1):
                 if sir_v[x - 1] < sir_v[y - 1]:
                     raspuns = x
                     break
                     break
             # Adaugam raspunsul in lista de raspunsuri
             raspunsuri.append(raspuns)
            answers.append(answer)
         elif intrebare[0] == 'S':
        # Daca interogarea este de tip 'S'
             y = intrebare[1]
         elif query[0] == 'S':
             raspuns = 0
             y = query[1]
             # Initializam raspunsul cu 0
            answer = 0
            # Cautam cea mai mare pozitie x < y pentru care v[x] < v[y]
             for x in range(y - 1, 0, -1):
             for x in range(y - 1, 0, -1):
                 if v[x - 1] < v[y - 1]:
                 if sir_v[x - 1] < sir_v[y - 1]:
                     answer = x
                     raspuns = x
                     break
                     break
             # Adaugam raspunsul in lista de raspunsuri
             raspunsuri.append(raspuns)
            answers.append(answer)
     return raspunsuri
     # Returnam lista de raspunsuri
 
     return answers
 
if __name__ == '__main__':
     file_in = open('nrappin.txt', 'r')
    file_out = open('nrappout.txt', 'w')
 
    try:
        N = int(file_in.readline())
        v = list(map(int, file_in.readline().split()))
        Q = int(file_in.readline())
        queries = []
        for _ in range(Q):
            query = file_in.readline().split()
            queries.append((query[0], int(query[1])))


# Citirea datelor de intrare din fisierul nrapp.in
        validare(N, v, Q, queries, file_out)
with open('nrapp.in', 'r') as file:
         answers = solve(N, v, queries)
    N = int(file.readline())
    v = list(map(int, file.readline().split()))
    Q = int(file.readline())
    queries = []
    for _ in range(Q):
         query = file.readline().split()
        queries.append((query[0], int(query[1])))


# Rezolvarea problemei
        for answer in answers:
answers = solve(N, v, Q, queries)
            file_out.write(str(answer) + '\n')


# Scrierea raspunsurilor in fisierul nrapp.out
    except ValueError:
with open('nrapp.out', 'w') as file:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
     for answer in answers:
     except IndexError:
         file.write(str(answer) + '\n')
         file_out.write("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 18:13, 29 November 2023

Cerința[edit]

Se dă un număr natural N si un șir v de N numere naturale. Sa se răspundă la Q întrebări de tipul:

D y: Care este cea mai mică poziție x, unde x > y, pentru care v[x] < v[y]? Dacă nu există o astfel de poziție, răspunsul acestei întrebări va fi N + 1. S y: Care este cea mai mare poziție x, unde x < y, pentru care v[x] < v[y]? Dacă nu există o astfel de poziție, răspunsul acestei întrebări va fi 0.

Date de intrare[edit]

Fișierul de intrare nrappin.txt conține pe prima linie numărul natural N, iar pe a doua linie N numere naturale separate prin spații. A treia linie va conține numărul natural nenul Q și apoi Q întrebări precum cele descrise anterior.

Date de ieșire[edit]

Fișierul de ieșire nrappout.txt va conține Q linii, anume răspunsul pentru fiecare întrebare în parte.

Restricții și precizări[edit]

  • 1 ≤ N ≤ 100.000
  • 1 ≤ v[i] ≤ 1.000.000

Exemplul 1:[edit]

nrappin.txt
8
1 3 6 5 2 1 9 6
8
S 1
D 2
D 3
S 4
S 5
D 6
D 7
D 8
nrappout.txt
Datele de intrare corespund restrictiilor impuse
0
5
4
2
1
9
8
9

Exemplul 2:[edit]

nrappin.txt
nrapp
nrappout.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit]

<syntaxhighlight lang="python" line="1" start="1">

def validare(n, sir_v, q, intrebari, file_output): # functia de validare a datelor de intrare

   if not 1 <= n <= 100000:
       raise ValueError
   for val in sir_v:
       if not 1 <= val <= 1000000:    # fiecare element trebuie sa fie numar intreg intre 1 si 1.000.000
           raise ValueError
   if q < 1:
       raise ValueError
   for intrebare in intrebari:
       if len(intrebare) != 2 or not isinstance(intrebare[1], int):
           raise ValueError
   file_output.write("Datele de intrare corespund restrictiilor impuse\n")


def solve(n, sir_v, intrebari): # functia de rezolvare

   raspunsuri = []
   for intrebare in intrebari:
       if intrebare[0] == 'D':
           y = intrebare[1]
           raspuns = n + 1
           for x in range(y + 1, n + 1):
               if sir_v[x - 1] < sir_v[y - 1]:
                   raspuns = x
                   break
           raspunsuri.append(raspuns)
       elif intrebare[0] == 'S':
           y = intrebare[1]
           raspuns = 0
           for x in range(y - 1, 0, -1):
               if sir_v[x - 1] < sir_v[y - 1]:
                   raspuns = x
                   break
           raspunsuri.append(raspuns)
   return raspunsuri


if __name__ == '__main__':

   file_in = open('nrappin.txt', 'r')
   file_out = open('nrappout.txt', 'w')
   try:
       N = int(file_in.readline())
       v = list(map(int, file_in.readline().split()))
       Q = int(file_in.readline())
       queries = []
       for _ in range(Q):
           query = file_in.readline().split()
           queries.append((query[0], int(query[1])))
       validare(N, v, Q, queries, file_out)
       answers = solve(N, v, queries)
       for answer in answers:
           file_out.write(str(answer) + '\n')
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>