fbpx

Problema #1078 – Adunscad – Rezolvari PBInfo

de Mihai-Alexandru

Considerăm un număr întreg N şi un şir de M cifre zecimale nenule. Să se determine dacă numărul N poate fi rezultatul unei expresii aritmetice simple (fără paranteze), formată exclusiv din cifrele şirului citit şi din operatorii aritmetici desemnaţi pentru operaţiile de adunare şi scădere (+, -).

Cerinţă

Scrieţi un program care citeşte numerele N şi M de pe prima linie a fişierului de intrare şi şirul de M cifre de pe linia următoare şi determină şi afişează expresia găsită sau valoarea 0 în cazul în care nu există soluţie.

Date de intrare

Fișierul de intrare adunscad.in conține pe prima linie numerele întregi N M, separate printr-un spaţiu, reprezentând valoarea ce trebuie obţinută la evaluarea expresiei şi numărul de cifre din şir. Linia a doua a fişierului de intrare conţine şirul celor M cifre nenule, separate prin câte un spaţiu.

Date de ieșire

Fișierul de ieșire adunscad.out va conține pe prima linie expresia determinată, în cazul în care există soluţie, sau valoarea 0 în cazul în care nu există soluţie.

Restricții și precizări

  • -180 ≤ N ≤ 180
  • 2 ≤ M ≤ 20
  • în şirul citit cifrele se pot repeta
  • toate cifrele din şir trebuie să apară şi în expresia aritmetică, în aceeaşi ordine în care au fost citite
  • în expresia aritmetică, orice cifră trebuie să fie precedată de un operator; în cazul în care prima cifră este precedată de operatorul '+' acesta nu se pune în expresie
  • în expresia aritmetică nu există spaţii
  • expresia aritmetică se termină cu caracterul sfârşit de linie
  • în cazul în care soluţia nu este unică se va afişa o soluţie corectă

Exemplu 1

adunscad.in

21 43 9 1 8

adunscad.out

3+9+1+8

Exemplu 2

adunscad.in

-1 41 2 3 5

adunscad.out

-1+2+3-5

Exemplu 3

adunscad.in

-7 71 1 1 1 1 1 1

adunscad.out

-1-1-1-1-1-1-1

Exemplu 4

adunscad.in

12 31 2 3

adunscad.out

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

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

int n , x[25] , a[20] , nr , ok;

void afisare()
{
    if(ok == 0)
    {
        for(int i = 1 ; i <= n ; i++)
        {
            if(i == 1 && x[i] == 1) cout << a[i];
            else if(x[i] == -1) cout << "-" << a[i];
            else cout << "+" << a[i];
        }
        cout << '\n';
        ok++;
    }
}

void back(int k , int sp)
{
    for(int i = -1; i <= 1; i += 2)
    {
        x[k] = i;
        sp = sp + i * a[k];
        if(k == n)
        {
            if(sp == nr) afisare();
        }
        else back(k + 1 , sp);
        sp = sp - i * a[k];
    }
}

int main()
{
    cin >> nr >> n;
    for(int i = 1 ; i <= n ; i++)
        cin >> a[i];
    back(1 , 0);
    if(ok == 0) cout << 0;
}
Comentarii

S-ar putea sa iti placa