# PBinfo #557 – Cartonase – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Gigel a învățat la școală despre progresii aritmetice – o progresie aritmetică este un șir de numere cu proprietatea că diferența dintre oricare două valori consecutive este aceeași. Astfel, Gigel a notat pe n cartonașe cei n termeni consecutivi ai unei progresii aritmetice și a plecat la joacă. Maleficul Costel a ascuns exact două dintre cartonașe și le-a amestecat pe celelalte. 

Determinaţi valorile scrise pe cele două cartonaşe ascunse de Costel.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n-2 numere naturale, reprezentând valorile scrise pe cartonașele care nu au fost ascunse.

Date de ieșire
Programul va afișa pe ecran două numere x y, separate prin exact un spaţiu, reprezentând valorile scrise pe cartonașele ascunse.

Restricții și precizări

4 ≤ n ≤ 1000
valorile scrise de Gigel pe cele n cartonașe sunt mai mici decât 1.000.000.000
Costel nu va lua niciodată primul sau ultimul cartonaș
x < y

Exemplu:
Intrare

6
13 19 7 4
Ieșire

10 16
Explicație
Cele șase numere scrise de Gigel erau 4 7 10 13 16 19. Dintre acestea, lipsesc 10 și 16.

## Cod sursă C++

```cpp
#include <iostream>
using namespace std;
int n , v[1005];
int main() {
    cin >> n;
    for (int i = 1; i <= n-2; ++i)
        cin >> v[i];
    n -= 2;
    for(int i = 1 ; i < n ; ++i)
		for(int j = i + 1 ; j <= n ; ++j)
			if(v[i] > v[j])
			{
				int aux = v[i];
				v[i] = v[j];
				v[j] = aux;
			}
	int x = -1, y = -1;
    if(n == 3 && v[2] - v[1] == v[3] - v[2] && (v[2] - v[1]) % 2 == 0)
    {
        int r = (v[2]-v[1]) / 2;
        x = v[1] + r; 
        y = v[2] + r;
    }
    else
        if(n == 2)
        {
            int r = (v[2]-v[1]) / 3;
            x = v[1] + r; 
            y = v[1] + 2 * r;
        }
        else
        {
            int r = v[n] - v[1];
            for(int i = 1; i < n ; ++i)
                if( r > v[i+1] - v[i] )
                    r = v[i+1] - v[i];
            for(int i = 1 ; i < n && y == -1 ; i ++)
                if(v[i+1] - v[i] != r)
                {
                    if(x == -1)
                    {
                        x = v[i] + r;
                        if(x + r < v[i+1])
                            y = x + r;
                    }
                    else
                        y = v[i] + r;
                }
        }
	cout << x << " " << y << endl;
	return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/557)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/557/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-557/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
