Rezolvare completă PbInfo #1043 Martisoare

Gică şi Lică lucrează la o fabrică de jucării, în schimburi diferite. Anul acesta patronul fabricii a hotărât să confecţioneze şi mărţişoare. Mărţişoarele gata confecţionate sunt puse în cutii numerotate consecutiv.

Cutiile sunt aranjate în ordinea strict crescătoare şi consecutivă a numerelor de pe acestea.
Gică trebuie să ia în ordine fiecare cutie, să lege la fiecare mărţişor câte un şnur alb-roşu şi apoi să le pună la loc în cutie.

În fiecare schimb, Gică scrie pe o tablă magnetică, utilizând cifre magnetice, în ordine strict crescătoare, numerele cutiilor pentru care a legat șnururi la mărțișoare.

Când se termină schimbul lui Gică, Lică, care lucrează în schimbul următor, vine şi ambalează cutiile cu numerele de pe tablă şi le trimite la magazine. Totul merge ca pe roate, până într-o zi, când, două cifre de pe tablă se demagnetizează şi cad, rămânând două locuri goale. Lică observă acest lucru, le ia de jos şi le pune la întâmplare pe tablă, în cele două locuri goale. Singurul lucru de care ţine cont este acela că cifra 0 nu poate fi prima cifră a unui număr.

Cerințe

Scrieţi un program care să citească numerele naturale N (reprezentând numărul de numere scrise pe tablă) şi c1, c2, …, cN (reprezentând numerele scrise, în ordine, pe tablă, după ce Lică a completat cele două locuri goale cu cifrele căzute) și care să determine:
a) cele două cifre care au fost schimbate între ele, dacă, după ce au completat locurile goale, acestea au schimbat șirul numerelor scrise de Gică;
b) numărul maxim scris pe tablă de Gică.

Date de intrare

Fișierul de intrare martisoare.in conține pe prima linie numărul natural N reprezentând numărul de numere de pe tablă. A doua linie a fişierului conţine, în ordine, cele N numere c1, c2, …, cN, separate prin câte un spaţiu, reprezentând, în ordine, numerele existente pe tablă, după ce Lică a completat cele două locuri libere cu cifrele căzute.

Date de ieșire

Fișierul de ieșire martisoare.out va conține pe prima linie două cifre, în ordine crescătoare, separate printr-un spațiu, reprezentând cele două cifre care au fost schimbate între ele sau 0 0 în cazul în care cele două cifre magnetice căzute, după ce au fost puse înapoi pe tablă, nu au schimbat șirul numerelor scrise de Gică. A doua linie va conține un număr reprezentând numărul maxim din secvenţa de numere consecutive scrisă de Gică pe tablă.

Restricții și precizări

  • 4 ≤ N ≤ 100.000
  • 1 ≤ ci ≤ 100.000, (1≤i≤N)
  • N, c1, c2, …, cN sunt numere naturale;
  • cele două cifre care cad de pe tablă pot proveni din același număr;
  • pentru rezolvarea cerinţei a) se acordă 60% din punctaj, iar pentru cerinţa b) se acordă 40% din punctaj.

Exemplul 1

martisoare.in

5
65 22 27 28 29

martisoare.out

2 6
29

Explicație

Gică a scris pe tablă, în ordine, numerele: 25 26 27 28 29
Au fost schimbate între ele cifra 2 din primul număr şi cifra 6 din al doilea număr. Cel mai mare număr scris de Gică pe tablă este 29.

Exemplul 2

martisoare.in

4
95 96 97 89

martisoare.out

8 9
98

Explicație

Gică a scris pe tablă, în ordine, numerele: 95 96 97 98
Au fost schimbate între ele cifrele ultimului număr.
Cel mai mare număr scris de Gică pe tablă este 98.

Exemplul 3

martisoare.in

5
35 36 37 38 39

martisoare.out

0 0
39

Explicație

Gică a scris pe tablă, în ordine, numerele: 35 36 37 38 39
Șirul numerelor nu a fost schimbat, cel mai mare număr fiind 39.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Martisoare:

// sursa oficiala - prof.Ana Intuneric
#include <fstream>
using namespace std;
ifstream f("martisoare.in");
ofstream g("martisoare.out");
int N,i,c1,c2,c3,c4,x,y,maxi,gasit;

int main()
{
    f>>N;
    f>>c1>>c2;
    //caut primul numar modificat
    if(c2-c1==1)
    {
        maxi=c1+N-1;
        for(i=3;i<=N && !gasit;i++)
        {
            f>>c3;
            if(c3-c2!=1)
            {
              x=c2+1;y=c3;gasit=1;
              while(x!=0 && y!=0)
              {
                  if(x%10!=y%10)
                        {if(x%10<y%10) g<<x%10<<<<y%10<<endl;
                        else  g<<y%10<<<<x%10<<endl;break;}
                  else x/=10,y/=10;
              }
            }
            else c2=c3;
        }
    }
    else
    {
      f>>c3>>c4;
      //c1 modificat
      if(c3-c2==1){x=c2-1;y=c1;gasit=1;maxi=c2+N-2;}
      else if(c4-c2==2){x=c2-1;y=c1;gasit=1;maxi=c4+N-4;}
           //c2 este modificat
           else if(c4-c3==1){x=c2;y=c3-1;gasit=1;maxi=c3+N-3;}
                else if(c3-c1==2) {x=c2;y=c3-1;gasit=1;maxi=c3+N-3;}//c2 modificat si c3 este bun
                     else {x=c2;y=c4-2;gasit=1;maxi=c4+N-4;}//c2 modificat si c4 este bun
      while(x!=0 && y!=0)
      {
                  if(x%10!=y%10)
                        {if(x%10<y%10) g<<x%10<<<<y%10<<endl;
                         else  g<<y%10<<<<x%10<<endl;break;
                        }
                  else x/=10,y/=10;
      }
    }

    if(!gasit) g<<"0 0
";
    g<<maxi<<endl;
    f.close();g.close();return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1043 Martisoare

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1043 Martisoare de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!