Rezolvare completă PbInfo #2007 Numere17

Un copil construiește un triunghi cu numerele naturale nenule astfel:

  • în vârful triunghiului scrie valoarea 1;
  • completează liniile triunghiului de sus în jos, iar căsuțele de pe aceeași linie de la stânga la dreapta cu numere naturale consecutive, ca în figurile următoare.

În figura 1 este ilustrat un astfel de triunghi având 5 linii, conținând numerele naturale de la 1 la 15.
În acest triunghi copilul începe să construiască drumuri, respectând următoarele reguli:

  • orice drum începe din 1;
  • din orice căsuță se poate deplasa fie în căsuța situată pe linia următoare în stânga sa (deplasare codificată cu 1), fie în căsuța situată pe linia următoare în dreapta sa (deplasare codificată cu 2);
  • orice drum va fi descris prin succesiunea deplasărilor efectuate.

De exemplu, drumul ilustrat în figura 2 poate fi descris astfel: 1 2 2 2.

Cerința

Scrieţi un program care rezolvă următoarele două cerințe:

1. citește descrierea unui drum și afișează numărul la care se termină drumul;
2. citește un număr natural nenul K, determină un drum care se termină cu numărul K pentru care suma numerelor prin care trece drumul este maximă și afișează această sumă.

Date de intrare

Fișierul de intrare numere17.in conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2).

Dacă C este egal cu 1, a doua linie din fișier conține un număr natural N, reprezentând lungimea drumului, iar a treia linie din fișier conţine descrierea drumului sub forma a N valori, 1 sau 2, separate între ele prin câte un spațiu.

Dacă C este egal cu 2, a doua linie din fișier conține numărul natural K.

Date de ieșire

Fișierul de ieșire numere17.out va conține o singură linie pe care va fi scris un singur număr natural. Dacă C=1, va fi scris numărul cu care se termină drumul descris în fișierul de intrare. Dacă C=2, va fi scrisă suma maximă a numerelor aflate pe un drum care se termină cu numărul K.

Restricții și precizări

  • 1 ≤ n ≤ 10000
  • 1 ≤ K ≤ 10001*10002/2
  • Pentru rezolvarea corectă a cerinţei 1 se acordă 40 de puncte; pentru rezolvarea corectă a cerinței 2 se acordă 50 de puncte. În concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemple.

Exemplul 1

numere17.in

1 
4
1 2 1 2

numere17.out

13

Explicație

Cerinţa este 1. Drumul descris are lungimea 4 și trece prin numerele 1,2,5,8,13

Exemplul 2

numere17.in

2 
9

numere17.out

19

Explicație

Cerinţa este 2. Suma maximă se obține pe drumul care trece prin numerele 1,3,6,9 (1+3+6+9=19).

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 Numere17:

//Emanuela Cerchez 90 puncte + 10 din oficiu
#include <fstream>

using namespace std;
ifstream fin("numere17.in");
ofstream fout("numere17.out");
int c, n, K, nr, sum;

int main()
{int lin, col, i, j, d, ultim;
 fin>>c;
 if (c==1)
    {
     fin>>n;
     col=1;
     for (i=0; i<n; i++)
         {
          fin>>d;
          col+=d-1;
         }
      lin=n+1;
      nr=lin*(lin-1)/2;//1+2+...lin-1
      nr+=col;
      fout<<nr<<'\n';
    }
    else
    {
      fin>>K;
      for (lin=1; K>lin*(lin+1)/2; lin++);
      col=K-lin*(lin-1)/2;
      sum=ultim=0;
      for (i=1; i<=col; i++)
            {ultim+=i;
             sum+=ultim;}
       for (i=col+1; i<=lin; i++)
           {
            ultim+=i;
            sum+=(ultim-(i-col));
           }
       fout<<sum<<'\n';
    }
    fout.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 #2007 Numere17

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2007 Numere17 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!