# PBinfo #1061 – Cifru1 – Rezolvare C++

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

## Enunț

Costel a descoperit într-o debara servieta cu cifru a tatălui său. Cifrul este compus din 4 discuri metalice pe care sunt inscripţionate cifrele de la 0 la 9. Fiecare disc se poate mişca individual, de sus în jos sau de jos în sus, formându-se combinaţii de cifre. De multe ori, datorită comodităţii, combinaţia ce permite deschiderea servietei este formată numai din cifre identice: 0000, 1111 etc.

Costel îşi imaginează un cifru compus din N discuri metalice, fiecare având inscripţionate cifrele de la 0 la 9, fiecare putând fi deplasat în cele două direcţii specificate anterior. Prin mutare Costel înţelege deplasarea unui disc în sus sau în jos, cu o singură poziţie, adică deplasarea discului până la cifra precedentă, respectiv următoare celei curente.

Cerința
Realizaţi un program care, cunoscând poziţia iniţială a fiecărui disc dintre cele N discuri ale cifrului, determină şi afişează:

a) cifra cea mai mare care apare pe discurile cifrului în forma iniţială; 
b) 
b1) numărul minim de mutări necesare pentru ca numărul obţinut pe cifru să fie compus numai din cifre identice, număr necesar deschiderii servietei;
b2) cifra cea mai mică ce se poate obţine în urma efectuării numărului minim de mutări determinat;
b3) numărul de  combinaţii  formate din cifre identice, care se poate obţine în urma efectuării numărului minim de mutări determinat.

Date de intrare
Fișierul de intrare cifru1.in conține:


pe prima linie numărul natural N reprezentând numărul discurilor;
pe următoarele N linii câte o cifră, reprezentând cifra curentă de pe fiecare disc al cifrului.

Date de ieșire
Fișierul de ieșire cifru1.out va conține, pe linii separate, cele 4 valori solicitate.

Restricții și precizări

1 < N ≤ 100 000
Un disc poate să rămână nemişcat.

Exemplu:
cifru1.in

4
7
3
9
0
cifru1.out

9
7
0
2
Explicație
Avem un cifru cu 4 discuri. Iniţial, cifrul este în starea 7390 (primul disc este poziţionat pe cifra 7, al doilea pe cifra 3 etc.)

Cea mai mare cifră de pe cifru este cifra 9.


Numărul minim de mutări este 7 şi se poate obţine în două moduri:

Deplasăm primul disc cu 2 poziţii în sus, al doilea disc cu 4 poziţii în jos, al treilea rămâne nemişcat, iar ultimul se deplasează cu o poziţie în jos. Combinaţia obţinută este 9999.
Deplasăm primul disc cu 3 poziţii în sus, al doilea disc cu 3 poziţii în jos, al treilea cu o poziţie în sus, iar ultimul rămâne nemişcat. Combinaţia obţinută este 0000.

Astfel,  cifra cea mai mică ce formează combinaţia cu număr minim de mutări este 0. Avem 2 combinaţii care se pot obţine în numărul minim de mutări determinat: 0000 şi 9999.

## Cod sursă C++

```cpp
// autor Alin Burtza
#include <fstream>
#include <cstdlib>
#define Fin "cifru1.in"
#define Fou "cifru1.out"
using namespace std;
int main()
{
	ifstream IN(Fin); 
	ofstream OUT(Fou);
	int N;				//numarul discurilor
	int Apar[10];		//Apar[i] = 1 daca culoarea i apare pe cel putin un disc
	int MAX;            //cifra maxima
	int NrMin;			//numarul minim de mutari
	int Cif;			//cifra obtinuta in numarul minim de mutari
	int Cate;			//numarul posibilitatilor
	int i,j, Nr, x;
	//initializari
	for(i=0;i<=9;i++) Apar[i] = 0;
	//citesc datele de intrare si
	//determin cifrele care apar initial si cifra maxima
	IN>>N; MAX = 0; Cif = -1; Cate = 0;
	for(i=1;i<=N;i++)
	{
		IN>>x;
		Apar[x]++;
		if(MAX < x) MAX = x;
	}
	//calculez numarul de mutari pentru fiecare cifra care apare
	NrMin = 10 * N + 1;
	for(i=0;i<=9;i++) 
	{
			Nr = 0;
			for(j=0;j<=9;j++)
				if(Apar[j] && j!=i)
				  Nr += abs(j-i) <= 10 - abs(j-i) ? Apar[j]*abs(j-i) : Apar[j]*(10 - abs(j-i));
			if(Nr<NrMin) NrMin = Nr, Cif = i, Cate = 1;
			else if(Nr==NrMin) Cate++;
	}
	OUT<<MAX<<'\n'<<NrMin<<'\n'<<Cif<<'\n'<<Cate<<'\n';	
	IN.close();
	OUT.close();
	return 0;
}
```

## Resurse

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