348
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
nnumere citite vor fi mai mici decât1.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