# PBinfo #2176 – Ruleta – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Nicuşor este elev în clasa a VI-a şi s-a gândit că este suficient de mare ca să inventeze un joc nou. Are doar o foaie de hârtie şi un pix. Scrie mai întâi n numere naturale în cerc. Acestea formează Ruleta numerelor. Jocul se desfăşoară după următoarele reguli:
-	se parcurge şirul numerelor în sensul deplasării acelor de ceasornic;
-	se porneşte de fiecare dată de la acelaşi element;  
-	se execută de fiecare dată o rotaţie completă;
-	fiecare element nenul se scade din elementul imediat următor doar dacă este mai mic sau egal cu acesta şi nenul;

Exemplu. Dacă notăm cu R1, R2, R3, R4, R5, R6, R7, R8 şirul numerelor ce formează ruleta din figura 1, atunci, o rotaţie completă realizează următoarele modificări asupra numerelor din listă:



-    ruleta se opreşte atunci când execută o rotaţie completă şi nu se modifică nici o valoare  din şirul elementelor.

Exemplu. Pentru ruleta din figura 1 se execută 4 rotaţii (dintre care 3 în care se fac modificări): 



Cerința
Scrieţi un program care să determine, pentru un şir de n numere naturale care indică starea iniţială a ruletei, numărul r de rotaţii complete efectuate respectând regulile jocului până la încheierea acestuia şi numărul t al elementelor nenule aflate în şir la încheierea jocului.

Date de intrare
Fişierul de intrare ruleta.in conţine pe prima linie numărul n de numere naturale aşezate în cerc iar pe linia a doua, separate prin câte un spaţiu, cele n valori , în ordinea deplasării, începând cu elementul de la care porneşte ruleta.

Date de ieșire
Fişierul de ieşire ruleta.out conţine pe prima linie, separate printr-un spaţiu, valorile r şi t (în această ordine).

Restricții și precizări

2 ≤ n ≤ 10000;
numerele de pe ruletă sunt numere naturale mai mici sau cel mult egale cu 30000;

Exemplu:
ruleta.in

8
1 2 3 4 3 2 3 1
ruleta.out

4 3

## Cod sursă C++

```cpp
//Cristina Sichim - 100 puncte
#include <fstream>
using namespace std;
int main()
{ 
  int R[10001], u[10001];
  int ok = 0, n, k, i, t, z = 0, gt = 0; 
  long r = 0;
  ifstream f("ruleta.in");
  ofstream g("ruleta.out");
  f >> n;
  for(i = 0; i < n; i++)
    {
      f >> R[i];
      u[i] = i + 1;
    }
  u[n-1] = 0; 
  k = n;
  i = 0;
  while(!gt)
    {
      if(u[i]==(i+1) % n)
        if(R[u[i]]>=R[i] && R[i])
          {
            R[u[i]] = R[u[i]] - R[i];
            ok = 1;
            if(R[u[i]] + z==0) 
              {
                k = i;
                z = 1;
              }
            else 
              if(R[i]<=R[u[i]]) 
                {
                  u[k] = i;
                  z = 0;
                  k = n;
                }
          }
      if(u[i]<i)
        {
          r++;
          if(!ok)
            gt = 1; 
          else 
            ok = 0;
        }
      i = u[i];
    }
  t = 0;
  for(i = 0; i < n ; i++) 
    t = t + (R[i]>0);
  g << r << ' ' << t<<'\n';
  f.close();
  g.close();
  return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2176)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2176/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2176/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
