Cerinţa
Se dau n
numere naturale. Determinaţi o aranjare a acestor numere pe un cerc, astfel încât suma produselor de câte două numere vecine să fie maximă.
Date de intrare
Fişierul de intrare cerc.in
conţine pe prima linie numărul n
, iar pe a doua linie cele n
numere naturale, separate prin spaţii..
Date de ieşire
Fişierul de ieşire cerc.out
va conţine pe prima linie cele n
numere, în ordinea determinată, separate prin exact un spaţiu.
Restricţii şi precizări
1 ≤ n ≤ 10
- cele
n
numere vor avea cel mult2
cifre - dacă există mai multe modalităţi de aranjare a numerelor astfel încât să se obţină aceeaşi sumă maximă, se va determina cea lexicografic minimă
Exemplu
cerc.in
5 1 2 3 4 5
cerc.out
1 2 4 5 3
Explicație
1*2 + 2*4 + 4*5 + 5*3 + 3*1 = 48
, şi este suma maximă care se poate obţine.
#include <bits/stdc++.h> using namespace std; ifstream cin("cerc.in"); ofstream cout("cerc.out"); int n , x[20] , a[20] , rez[20] , p[20] , maxi; void afisare() { for(int i = 1 ; i <= n ; i++) cout << a[x[i]] << " "; cout << '\n'; } int suma() { int s = 0; s += a[x[1]] * a[x[n]]; for(int i = 2 ; i <= n ; i++) s += a[x[i]] * a[x[i - 1]]; return s; } void back(int k) { for(int i = 1 ; i <= n ; i++) if(!p[i]) { x[k] = i; p[i] = 1; if(k == n) { if(suma() > maxi) { maxi = suma(); for(int q = 1 ; q <= n ; q++) rez[q] = x[q]; } } else back(k + 1); p[i] = 0; } } int main() { cin >> n; for(int i = 1 ; i <= n ; i++) cin >> a[i]; sort(a + 1 , a + n + 1); x[1] = 1; back(2); for(int i = 1 ; i <= n ; i++) cout << a[rez[i]] << " "; return 0; }