2098 - Meteo: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == Enunt == Centrul de meteorologie dintr-o ţară îndepărtată, aflată aproape de Polul Nord, doreşte să stabilească modul în care încălzirea globală afectează temperaturile din acea ţară. Ei notează pe parcursul a N zile consecutive temperaturile maxime zilnice şi sunt interesaţi să determine cea mai lungă perioadă continuă de timp în care temperaturile înregistrate în zile consecutive au alternat ca semn. == Cerința == Scrieţi un program care, pe...)
 
Fără descriere a modificării
Linia 6: Linia 6:


== Date de intrare ==
== Date de intrare ==
Fişierul de intrare meteo.in conţine pe prima linie numărul natural N, reprezentând numărul total de zile pentru care se efectuează studiul. Pe cea de-a doua linie vor fi scrise N numere întregi separate prin spaţii, al i-lea număr de pe linie fiind temperatura maximă zilnică înregistrată în ziua i a studiului (1≤i≤N).
Fişierul de intrare meteoin.txt conţine pe prima linie numărul natural N, reprezentând numărul total de zile pentru care se efectuează studiul. Pe cea de-a doua linie vor fi scrise N numere întregi separate prin spaţii, al i-lea număr de pe linie fiind temperatura maximă zilnică înregistrată în ziua i a studiului (1≤i≤N).


== Date de ieșire ==
== Date de ieșire ==
Fişierul de ieşire meteo.out va conţine pe prima linie un număr natural NrMax, reprezentând numărul maxim de zile consecutive pentru care temperaturile au alternat ca semn. Pe cea de a doua linie vor fi scrise NrMax valori întregi, separate prin spaţii, reprezentând temperaturile (alternante ca semn) înregistrate în cele NrMax zile. În cazul în care nu există nici măcar două zile consecutive cu temperaturi alternante ca semn, fişierul de ieşire va conţine o singură linie, pe care va fi scrisă valoarea 0.
Fişierul de ieşire meteoout.txt va conţine pe prima linie un număr natural NrMax, reprezentând numărul maxim de zile consecutive pentru care temperaturile au alternat ca semn. Pe cea de a doua linie vor fi scrise NrMax valori întregi, separate prin spaţii, reprezentând temperaturile (alternante ca semn) înregistrate în cele NrMax zile. În cazul în care nu există nici măcar două zile consecutive cu temperaturi alternante ca semn, fişierul de ieşire va conţine o singură linie, pe care va fi scrisă valoarea 0.


== Restricții și precizări ==
== Restricții și precizări ==
Linia 18: Linia 18:
== Exemplu 1 ==
== Exemplu 1 ==
; Intrare
; Intrare
; meteo.in
; meteoin.txt
: 16
: 16
: 1 -5 -3 2 -1 7 -2 5 1 7 -9 0 -1 6 -1 -8
: 1 -5 -3 2 -1 7 -2 5 1 7 -9 0 -1 6 -1 -8
; Ieșire
; Ieșire
; meteo.out
; meteoout.txt
: 6
: 6
: -3 2 -1 7 -2 5
: -3 2 -1 7 -2 5
Linia 28: Linia 28:
== Exemplu 2 ==
== Exemplu 2 ==
; Intrare
; Intrare
; meteo.in
; meteoin.txt
: 2
: 2
: 0 1
: 0 1
Linia 71: Linia 71:
def main():
def main():
     try:
     try:
         with open("meteo.in", "r") as f:
         with open("meteoin.txt", "r") as f:
             n_zile_consecutive = int(f.readline())
             n_zile_consecutive = int(f.readline())
             temperaturi = list(map(int, f.readline().split()))
             temperaturi = list(map(int, f.readline().split()))
Linia 81: Linia 81:
         lungime_maxima, secventa_maxima = determina_secventa(n_zile_consecutive, temperaturi)
         lungime_maxima, secventa_maxima = determina_secventa(n_zile_consecutive, temperaturi)


         with open("meteo.out", "w") as f:
         with open("meteoout.txt", "w") as f:
             if lungime_maxima < 2:
             if lungime_maxima < 2:
                 f.write("0\n")
                 f.write("0\n")

Versiunea de la data 1 decembrie 2023 17:19

Enunt

Centrul de meteorologie dintr-o ţară îndepărtată, aflată aproape de Polul Nord, doreşte să stabilească modul în care încălzirea globală afectează temperaturile din acea ţară. Ei notează pe parcursul a N zile consecutive temperaturile maxime zilnice şi sunt interesaţi să determine cea mai lungă perioadă continuă de timp în care temperaturile înregistrate în zile consecutive au alternat ca semn.

Cerința

Scrieţi un program care, pe baza temperaturilor înregistrate pe parcursul a N zile consecutive, determină o succesiune de zile consecutive având lungime maximă pentru care temperaturile înregistrate au alternat ca semn. Dacă există mai multe astfel de secvenţe, meteorologii sunt interesaţi de cea mai recentă. Dacă nu există măcar două zile consecutive cu temperaturi alternante ca semn, ei vor înregistra rezultatul 0.

Date de intrare

Fişierul de intrare meteoin.txt conţine pe prima linie numărul natural N, reprezentând numărul total de zile pentru care se efectuează studiul. Pe cea de-a doua linie vor fi scrise N numere întregi separate prin spaţii, al i-lea număr de pe linie fiind temperatura maximă zilnică înregistrată în ziua i a studiului (1≤i≤N).

Date de ieșire

Fişierul de ieşire meteoout.txt va conţine pe prima linie un număr natural NrMax, reprezentând numărul maxim de zile consecutive pentru care temperaturile au alternat ca semn. Pe cea de a doua linie vor fi scrise NrMax valori întregi, separate prin spaţii, reprezentând temperaturile (alternante ca semn) înregistrate în cele NrMax zile. În cazul în care nu există nici măcar două zile consecutive cu temperaturi alternante ca semn, fişierul de ieşire va conţine o singură linie, pe care va fi scrisă valoarea 0.

Restricții și precizări

  • 4 ⩽ N ⩽ 1.000
  • Temperaturile maxime zilnice sunt numere întregi ce aparţin intervalului [-50,50].
  • Temperatura de 0 grade va fi considerată pozitivă.

Exemplu 1

Intrare
meteoin.txt
16
1 -5 -3 2 -1 7 -2 5 1 7 -9 0 -1 6 -1 -8
Ieșire
meteoout.txt
6
-3 2 -1 7 -2 5


Exemplu 2

Intrare
meteoin.txt
2
0 1
Ieșire
Date de intrare invalide.


Rezolvare

#2098 - Meteo
def validare_date(n_zile_consecutive, temperaturi):
    if not (3 < n_zile_consecutive <= 1000):
        return False
    if len(temperaturi) != n_zile_consecutive:
        return False
    for temp in temperaturi:
        if not (-50 <= temp <= 50):
            return False
    return True


def determina_secventa(n_zile_consecutive, temperaturi):
    secventa_maxima = []
    lungime_maxima = 0
    secventa_curenta = [temperaturi[0]]
    lungime_curenta = 1

    for i in range(1, n_zile_consecutive):
        if temperaturi[i] * temperaturi[i - 1] < 0:
            secventa_curenta.append(temperaturi[i])
            lungime_curenta += 1
        else:
            secventa_curenta = [temperaturi[i]]
            lungime_curenta = 1

        if lungime_curenta > lungime_maxima:
            lungime_maxima = lungime_curenta
            secventa_maxima = secventa_curenta.copy()

    return lungime_maxima, secventa_maxima


def main():
    try:
        with open("meteoin.txt", "r") as f:
            n_zile_consecutive = int(f.readline())
            temperaturi = list(map(int, f.readline().split()))

        if not validare_date(n_zile_consecutive, temperaturi):
            print("Date de intrare invalide.")
            return

        lungime_maxima, secventa_maxima = determina_secventa(n_zile_consecutive, temperaturi)

        with open("meteoout.txt", "w") as f:
            if lungime_maxima < 2:
                f.write("0\n")
            else:
                f.write(f"{lungime_maxima}\n")
                f.write(" ".join(map(str, secventa_maxima)))
    except FileNotFoundError:
        print("Fisierul meteo.in nu exista.")


if __name__ == "__main__":
    main()

Explicatie

Studiul a fost efectuat pe durata a 16 zile. În această perioadă au existat două secvenţe de zile consecutive având lungime maximă (6) şi în care temperaturile au alternat ca semn. În fişierul de ieşire a fost afişată prima secvență, cea mai recentă fiind 7 -9 0 -1 6 -1.