#include #include #include #include #include #include using namespace std; const int MAX_N = 10000; typedef std::vector V1D; typedef std::vector V2D; vector numbers; void eraseRows(V2D & v, int row){ //erase row v.erase(v.begin()+row); } void eraseColumns(V2D & v, int col){ //erase column for(int i=0; i < (int)v.size(); ++i){ v[i].erase(v[i].begin()+col); } } void removeRC(V2D & v, int posI, int posJ){ if(posI > posJ){ eraseRows( v, posI ); eraseRows( v, posJ ); eraseColumns( v, posI ); eraseColumns( v, posJ ); }else{ eraseRows( v, posJ ); eraseRows( v, posI ); eraseColumns( v, posJ ); eraseColumns( v, posI ); } } int main(){ ifstream fin( "input.txt" ); assert( fin ); int n, k; int posI = 0; int posJ = 0; int small = MAX_N; int costoTot = 0; fin >> n; int nTriplets = (n / 3); for( int i = 0; i < n; i++ ){ fin >> k; numbers.insert( numbers.begin(),k ); } fin.close(); sort( numbers.begin(), numbers.end() ); V2D diff( n, V1D(n) ); for( int i = 0;i < n; i++){ for( int j = 0; j < n; j++ ){ diff[i][j] += abs( abs( (double)numbers[i] ) - abs( (double)numbers[j]) ); if( diff[i][j] < small && j > i ){ small = diff[i][j]; posI = i; posJ = j; } } } costoTot += small; small = MAX_N; removeRC(diff, posI, posJ); n = n - 2; nTriplets--; while( nTriplets ){ for(int i = 0; i < n; i++ ){ for(int j = 0; j < n; j++ ){ if( diff[i][j] < small && j > i ){ small = diff[i][j]; posI = i; posJ = j; } } } costoTot += small; small = MAX_N; removeRC(diff, posI, posJ); n = n - 2; nTriplets--; } ofstream fout("output.txt"); fout << costoTot; fout.close(); return 0; }