#include <algorithm>
#include <numeric>
#include <limits>
#include <iostream>
#include <vector>
using array_type = std::vector<int>;
array_type input(std::string info, int n) {
array_type result(n);
std::cout << info;
for ( ; n--; )
std::cin >> result[n];
return result;
}
int score(const std::vector<array_type>& arrays, const array_type& weights) {
return std::inner_product( std::begin( arrays ), std::end( arrays ) - 1, std::begin( arrays ) + 1, 0, std::plus<int>{},
[&](auto& a, auto& b) {
return std::inner_product( std::begin( a ), std::end( a ), std::begin( b ), 0, std::plus<int>{},
[&](auto& x, auto& y) {
return ( x == y ) * weights[&x - &a.front()];
} );
} );
}
int main()
{
std::cout << "Arraylänge: ";
int l = 0;
std::cin >> l;
array_type weights = input( "Gewichte: ", l );
std::cout << "Anzahl Arrays: ";
int n = 0;
std::cin >> n;
std::vector<array_type> arrays;
for ( int i = 0; i != n; ++i ) {
arrays.push_back( input( "Array " + std::to_string( i ) + ": ", l ) );
}
std::sort( begin( arrays ), end( arrays ) );
int best_score = std::numeric_limits<int>::min();
std::vector<array_type> best;
do {
if ( score( arrays, weights ) > best_score ) {
best_score = score( arrays, weights );
best = arrays;
}
} while ( next_permutation( std::begin( arrays ), std::end( arrays ) ) );
std::cout << "\nBeste Punkte: " << best_score << '\n';
for ( auto& a : arrays ) {
std::cout << "( ";
for ( auto& x : a ) {
std::cout << x << ' ';
}
std::cout << ")\n";
}
std::cout << std::endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxsaW1pdHM+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIGFycmF5X3R5cGUgPSBzdGQ6OnZlY3RvcjxpbnQ+OwoKYXJyYXlfdHlwZSBpbnB1dChzdGQ6OnN0cmluZyBpbmZvLCBpbnQgbikgewogICAgYXJyYXlfdHlwZSByZXN1bHQobik7CiAgICBzdGQ6OmNvdXQgPDwgaW5mbzsKICAgIGZvciAoIDsgbi0tOyApCiAgICAgICAgc3RkOjpjaW4gPj4gcmVzdWx0W25dOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKaW50IHNjb3JlKGNvbnN0IHN0ZDo6dmVjdG9yPGFycmF5X3R5cGU+JiBhcnJheXMsIGNvbnN0IGFycmF5X3R5cGUmIHdlaWdodHMpIHsKICAgIHJldHVybiBzdGQ6OmlubmVyX3Byb2R1Y3QoIHN0ZDo6YmVnaW4oIGFycmF5cyApLCBzdGQ6OmVuZCggYXJyYXlzICkgLSAxLCBzdGQ6OmJlZ2luKCBhcnJheXMgKSArIDEsIDAsIHN0ZDo6cGx1czxpbnQ+e30sCiAgICAgICAgWyZdKGF1dG8mIGEsIGF1dG8mIGIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ZDo6aW5uZXJfcHJvZHVjdCggc3RkOjpiZWdpbiggYSApLCBzdGQ6OmVuZCggYSApLCBzdGQ6OmJlZ2luKCBiICksIDAsIHN0ZDo6cGx1czxpbnQ+e30sCiAgICAgICAgICAgICAgICBbJl0oYXV0byYgeCwgYXV0byYgeSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoIHggPT0geSApICogd2VpZ2h0c1smeCAtICZhLmZyb250KCldOwogICAgICAgICAgICAgICAgfSApOwogICAgICAgIH0gKTsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgIkFycmF5bMOkbmdlOiAiOwogICAgaW50IGwgPSAwOwogICAgc3RkOjpjaW4gPj4gbDsKICAgIGFycmF5X3R5cGUgd2VpZ2h0cyA9IGlucHV0KCAiR2V3aWNodGU6ICIsIGwgKTsKICAgIHN0ZDo6Y291dCA8PCAiQW56YWhsIEFycmF5czogIjsKICAgIGludCBuID0gMDsKICAgIHN0ZDo6Y2luID4+IG47CiAgICBzdGQ6OnZlY3RvcjxhcnJheV90eXBlPiBhcnJheXM7CiAgICBmb3IgKCBpbnQgaSA9IDA7IGkgIT0gbjsgKytpICkgewogICAgICAgIGFycmF5cy5wdXNoX2JhY2soIGlucHV0KCAiQXJyYXkgIiArIHN0ZDo6dG9fc3RyaW5nKCBpICkgKyAiOiAiLCBsICkgKTsKICAgIH0KICAgIHN0ZDo6c29ydCggYmVnaW4oIGFycmF5cyApLCBlbmQoIGFycmF5cyApICk7CiAgICBpbnQgYmVzdF9zY29yZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCk7CiAgICBzdGQ6OnZlY3RvcjxhcnJheV90eXBlPiBiZXN0OwogICAgZG8gewogICAgICAgIGlmICggc2NvcmUoIGFycmF5cywgd2VpZ2h0cyApID4gYmVzdF9zY29yZSApIHsKICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlKCBhcnJheXMsIHdlaWdodHMgKTsKICAgICAgICAgICAgYmVzdCA9IGFycmF5czsKICAgICAgICB9CiAgICB9IHdoaWxlICggbmV4dF9wZXJtdXRhdGlvbiggc3RkOjpiZWdpbiggYXJyYXlzICksIHN0ZDo6ZW5kKCBhcnJheXMgKSApICk7CiAgICBzdGQ6OmNvdXQgPDwgIlxuQmVzdGUgUHVua3RlOiAiIDw8IGJlc3Rfc2NvcmUgPDwgJ1xuJzsKICAgIGZvciAoIGF1dG8mIGEgOiBhcnJheXMgKSB7CiAgICAJc3RkOjpjb3V0IDw8ICIoICI7CiAgICAgICAgZm9yICggYXV0byYgeCA6IGEgKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB4IDw8ICcgJzsKICAgICAgICB9CiAgICAgICAgc3RkOjpjb3V0IDw8ICIpXG4iOwogICAgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQ==