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
.
7
şi se poate obţine în două moduri:
- Deplasăm primul disc cu
2
poziţii în sus, al doilea disc cu4
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ă este9999
. - Deplasăm primul disc cu
3
poziţii în sus, al doilea disc cu3
poziţii în jos, al treilea cu o poziţie în sus, iar ultimul rămâne nemişcat. Combinaţia obţinută este0000
.
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
.
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 Cifru1:
// 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;
}
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 .
Rezolvarea problemei #1061 Cifru1
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1061 Cifru1 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!