În timpul activităților din “Săptămâna Altfel” elevii clasei a VII-a doresc să ajute la organizarea cărților din biblioteca școlii. Fiecare carte este etichetată cu un cod care este exprimat printr-un un șir de caractere distincte. Acestea pot fi cifrele 0, 1,..,9
și primele zece litere mici ale alfabetului englez a, b,..,j
. Codul identifică în mod unic fiecare carte, adică nu vor exista două cărți cu același cod, dar şi genul literar din care acestea face parte. Cărțile din acelaşi gen literar au codul de identificare format din aceleaşi caractere, distincte, dispuse în altă ordine.
Numim coduri pereche două coduri de identificare care au același număr de caractere și care diferă printr-un
caracter. De exemplu, codurile 42a8
și 2c8a
sunt coduri pereche. Pe de altă parte, codurile 42a8
și 248a
,
respectiv 42ab
și 248c
, nu sunt coduri pereche.
Cerința
Fiind dat șirul celor N
coduri de identificare, scrieţi un program care să rezolve următoarele cerinţe:
- determină numărul de cărți din cel mai numeros gen literar și numărul de genuri literare care au acest număr maxim de cărți.
- determină numărul de coduri, din șirul celor
N
, care sunt coduri pereche cu ultimul cod din șir
Date de intrare
Fişierul de intrare carte.in
conţine pe prima linie un număr natural C
. Pentru toate testele, C
poate lua
numai valorile 1
sau 2
. Pe a doua linie se află numărul N
de cărți din biblioteca școlii, iar pe următoarele N
linii, câte un șir de caractere pe fiecare linie, ce reprezintă codul pentru identificarea unei cărți.
Date de ieșire
Dacă valoarea lui C
este 1
, se va rezolva numai cerința 1. În acest caz, fişierul de ieşire carte.out
conţine
pe prima linie numărul maxim de cărți de același gen literar, MAX
, iar pe a doua linie numărul de genuri
literare care au exact MAX
cărți.
Dacă valoarea lui C
este 2
, se va rezolva numai cerința 2. În acest caz, fişierul de ieşire carte.out
conţine
pe prima linie numărul de coduri pereche cu ultimul cod din șirul celor N
.
Restricții și precizări
1 ≤ N ≤ 1 000 000
- Pentru rezolvarea corectă a primei cerințe se obțin 60 de puncte, iar pentru rezolvarea corectă a celei de
a doua cerinţe se acordă 40 de puncte
Exemplul 1
carte.in
1 8 1289f5 128905 129805 219805 12 1e2 12e e21
carte.out
3 2
Explicație
Sunt maxim 3
cărți de același gen literar. Sunt 2
genuri cu număr maxim de cărți: {128905, 129805, 219805}
și
{1e2, 12e, e21 }
.
Exemplul 2
carte.in
2 10 1289f5 128905 5 12 129805 219805 218905 132 312 2189e5
carte.out
5
Explicație
Sunt 5
coduri pereche cu 2189e5
: 1289f5
, 128905
, 129805
, 219805
, 218905
.
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 carte2:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
#define Nmax 1300000
int A[Nmax], poz, j, P, N, K, l, k, x,Max, nMax, y, S=0;
int i, mx, n, cx, ed, nrC=0, C, mp, np, ngen, nm, Vmax, nr, nc, cmx, mu, nu;
char s[25], c;
int main()
{
freopen("carte.in", "r", stdin);
freopen("carte.out","w", stdout);
scanf("%d\n%d\n",&C,&N);
assert(0 < N && N <= 1000000);
for( i = 1; i <= N; i++)
{
s[0]='\0';
scanf("%s\n", &s);
n = strlen(s);
assert(0 < n && n <= 20);
mx = 0; j = 0;
while(j < n)
{
assert(isdigit(s[j]) || isalpha(s[j]) && s[j]<='j');
if(isdigit(s[j])) x=s[j]-'0'; else x=s[j]-'a' + 10;
mx |= 1<<x;
++j;
}
A[mx]++;
if(A[mx]==1) ngen++;
if(A[mx] > Max) Max = A[mx], nMax=1;
else if(A[mx] == Max) nMax++;
if(i==N) {mu = mx; nu = n;}
if(mx>Vmax) Vmax=mx;
}
if(C==1) printf("%d\n%d\n", Max, nMax);
else {
for(mx = 0; mx <= Vmax; mx++)
if(A[mx]){
ed = mu ^ mx;
nc=0;
do {ed &= ed-1; nc++;} while (ed);
nr=0; cmx = mx;
do { cmx&= cmx-1; nr++;} while (cmx);
if(nr==nu && nc==2) nrC+=A[mx];
}
printf("%d\n", nrC);
}
s[0]='\0';
scanf("%s\n", &s);
n = strlen(s);
assert(0==n);
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 #2046 carte2
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2046 carte2 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!