fbpx

Problema #2192 – Talent – Rezolvari PBInfo

de Mihai-Alexandru

Românii au talent! Atraşi de marele premiu oferit de organizatorii concursului Românii au talent, la preselecţia organizată la Piatra Neamţ au venit foarte mulţi români să demonstreze că au talent.

La înscriere, fiecare participant a primit câte un număr de concurs, reprezentat de un număr natural nenul. Unii dintre participanţi pot avea statut special, fiind admişi direct în semifinale, ca urmare a rezultatelor deosebite obţinute la ediţiile anterioare, numărul de concurs primit de aceştia având proprietatea că toate cifrele lui pot fi aranjate astfel încăt să formeze un număr palindrom.

Printre numerele de concurs primite de participanţii cu statut special, există numere care au în scrierea lor zecimală un număr maxim de cifre distincte. Cel mai mic dintre aceste numere reprezintă numărul de concurs al participantului VIP.

Cerinta

Scrieţi un program care citeşte numărul natural n (reprezentând numărul de participanţi înscrişi la concurs), n numere naturale (reprezentând numerele de concurs ale celor n participanţi) şi determină:

a) numărul x de participanţi admişi direct în semifinale;

Exemplu

talent.in

8
17864
9900
90321
4704
351
83181
46476
7432

talent.out

3 46476

Explicație

Sunt 3 participanţi calificaţi direct în semifinală. Numerele lor de concurs sunt numere ale căror cifre pot fi aranjate astfel încât să formeze un palindrom : 9900(format din 2 cifre distincte), 83181 (format din 3 cifre distincte) şi 46476 (format din 3 cifre distincte). Dintre acestea, cel mai mic număr format dintr-un număr maxim de cifre distincte este 46476 reprezentând numărul de concurs al participantului VIP.

#include <bits/stdc++.h>
using namespace std;

ifstream cin("talent.in");
ofstream cout("talent.out");

int pal(int n)
{
    int f[10]={0};
    int cn=0;
    while(n)
    {
        f[n%10]++;
        n/=10;
        cn++;
    }
    int cnt=0;
    for(int i = 0 ; i < 10 ; ++i)
    {
        if(f[i]%2==1)
        cnt++;
        if(f[0]%2==0 && cn==f[0]+1 && f[0]!=0)
        {
            cnt++;    
        }
    }
    if(cnt==0 || cnt==1)
    return 1;
    else
    return 0;
}

int mult(int n)
{
    int f[10]={0};
    while(n)
    {
        f[n%10]++;
        n/=10;
    }
    int ok=0;
    for(int i = 0 ; i < 10 ; ++i)
    {
        if(f[i]!=0)
        ok++;
    }
    return ok;
}

int main()
{
    int n;
    cin >> n;
    int a[15001];
    int cnt=0;
    int max=0;
    for(int i = 0 ; i < n ; ++i)
    {
    cin >> a[i];
    if(pal(a[i]))
    {
        cnt++;
        if(max < mult(a[i]))
        max=mult(a[i]);
    }
    }
    cout << cnt;
    int nmax=2000000001;
    if(cnt!=0)
    {
        for(int i = 0 ; i < n ; ++i)
        {
        if(mult(a[i])==max && pal(a[i]))
        {
            if(a[i]<nmax)
            nmax=a[i];
        }
        }
        cout << ' ' << nmax;
    }
    else
    cout << ' ' << 0;
    return 0;    
}
Comentarii

S-ar putea sa iti placa