Jump to content

Recommended Posts

  • Moderators
Posted

Problema control, campion.edu.ro
 
Gigel a primit spre păstrare un set de n cutii de greutăţi nu neapărat distincte. El a cântărit cutiile şi pentru fiecare greutate distinctă a notat pe o foaie, în ordine crescătoare a greutăţilor, numărul de cutii cu greutatea respectivă.
Deoarece fratele său mai mic avea prostul obicei să se joace cu numerele scrise de el pe foaie, Gigel s-a gândit să calculeze un „număr de control” după următorul algoritm: începând de la primul număr a grupat numerele de apariţii ale greutăţilor câte trei (dacă îi rămân numere negrupate la sfârşit, le ignoră). Dacă într-un grup sunt numai numere pare sau numai impare notează grupul cu cifra 1, altfel îl notează cu cifra 0. Din şirul astfel obţinut, se formează un număr care are ca valoare cifra zecilor egală cu numărul de valori 1 şi cifra unităţilor egală cu numărul de valori 0, obţinându-se astfel „numărul de control”.
 
Cerinţă
 
Citind greutăţile cutiilor, să se determine „numărul de control” şi să se verifice dacă este număr prim.
 
 
Date de intrare
De pe prima linie a fişierului de intrare control.in se citeşte numărul n. Pe fiecare dintre următoarele n linii se găseşte câte un număr natural reprezentând greutăţile celor n cutii.
 
Date de ieşire
 
În fişierul de ieşire control.out se va scrie pe prima linie „numărul de control”, urmat, pe linia a doua, de valoarea 0 sau 1. Pe linia a doua se va afişa 1 dacă numărul este prim, respectiv 0 în caz contrar.
Atenţie: Se vor afişa doar două valori, fără mesaje, pe două linii diferite!!!
 
Restricţii
 
1 <= n <= 100
Fiecare greutate este un număr natural, mai mic sau egal cu 200
 
Exemplu:
 
control.in
21
1
3
2
6
2
6
2
8
9
8
8
9
10
8
11
18
11
12
14
15
17

 
 
control.out
31
1

 
Explicaţii
După ordonare se obţine şirul: 1 2 2 2 3 6 6 8 8 8 8 9 9 10 11 11 12 14 15 17 18
Se obţine apoi: 1 3 1 2 4 2 1 2 1 1 1 1 1
după care grupându-le câte 3 de la stânga spre dreapta se va obţine:
1 1 0 1

Din valorile 1 1 0 1 se obţine numărul de control 31, care este număr prim.
 

 
Rezolvare:
 
Nu cred că e cea mai eficientă, dar soluţia de mai jos primeşte punctajul maxim (100p)



/**
  *    Rezolvare problema control, campion.edu.ro
  *    Limbaj: C++ (defapt C cu fstream şi algorithm)
  *    Autor: Courage
  *    Data: 21 iun 2014
  */
  
#include <fstream>
#include <algorithm>
#include <math.h>

std::ifstream in("control.in");
std::ofstream out("control.out");

int n, i, sir1[100], sir2[100], nr_elem_consecutive, element_sir_2 = 0, sir3[100];
int d, suma = 0, cifre_d_zero = 0 , cifre_d_unu = 0;


bool doar_pare_sau_impare (int a, int b, int c)
{
    if (a % 2  and  b % 2  and  c % 2)  
        return true;
    if (a % 2 == 0  and  b % 2 == 0  and  c % 2 == 0)  
        return true;
    return false;
}


bool prim(int numar)
{
    if (numar%2 == 0)
    {
        if (numar == 2)  
            return true;
        return false;
    }
    else
    {
        for (int divizor = 3 ; divizor <= sqrt(numar) ; divizor += 2)
            if (numar % divizor == 0)  
                return false;
        return true;
    }
}


int main()
{
    in >> n;
    for (i=0 ; i < n ; i++)  in >>sir1[i];
    std::sort(sir1, sir1 + n);
    for (i=0 ; i < n ; i++)
    {
        nr_elem_consecutive = 1;
        if (sir1[i] == sir1[i+1])
        {
            while (sir1[i] == sir1[++i])  
                nr_elem_consecutive++;
            i--;
        }
        sir2[element_sir_2++] = nr_elem_consecutive;
    }
    while ((element_sir_2+1) % 3 != 0)  
        element_sir_2--;
    while (suma <= element_sir_2)
        if (doar_pare_sau_impare(sir2[suma++], sir2[suma++], sir2[suma++]))  
            cifre_d_unu++;
        else  
            cifre_d_zero++;
    if (cifre_d_unu != 0 and cifre_d_zero != 0)  
        d = cifre_d_unu * 10 + cifre_d_zero;
    else  
    {
        if (cifre_d_unu == 0)  
            d = cifre_d_zero;
        else  
            d = cifre_d_unu;
    }
    out << d << 'n';
    if (prim(d))  
        out << 1;
    else  
        out << 0;
    return 0;
}

  • Upvote 3

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.