fbpx

Problema #2646 – impartire – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dau n numere naturale, unde n este un număr par. Se grupează cele n numere în perechi şi pentru fiecare pereche de numere se află restul împărţirii unui număr din pereche la celălalt. Se cere să se afle valoarea minimă a sumei acestor resturi.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi cele n numere naturale, separate prin spații.

Date de ieșire

Programul va afișa pe ecran suma minimă a resturilor.

Restricții și precizări

  • 2 ≤ n ≤ 18
  • cele n numere citite vor fi mai mici decât 1.000

Exemplu

Intrare

4
6 5 3 4

Ieșire

1

Explicație

Grupând numerele 6 cu 3 și 4 cu 5 se obțin resturile 0, respectiv 1. Suma lor este 1.

#include <bits/stdc++.h>

using namespace std;

int n , x[20] , p[20] , a[20] , mini = 1000000000;

int suma(int n)
{
    int sum = 0;
    for(int i = 1 ; i < n ; i += 2)
        sum += max(a[x[i]] , a[x[i + 1]]) % min(a[x[i]] , a[x[i + 1]]);
    return sum;
}

void back(int k)
{
    if(suma(k) > mini) return ;
    else
    if(k >= n)
    {
        if (suma(k) < mini) mini = suma(k);
    }
    else
    {
        int xi = 1;
        while (xi <= n && p[xi] == 1)xi ++;
        x[++ k] = xi;
        p[xi] = 1;
        for (int i = xi + 1; i <= n; i ++)
        {
            if (p[i] == 0)
            {
                p[i] = 1;
                x[k + 1] = i;
                back(k + 1);
                p[i] = 0;
            }
        }
        p[xi] = 0;
    }
}

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

S-ar putea sa iti placa