/* vim: set ts=4 sts=4 sw=4 si foldmethod=marker: */ // {{{ stock programming challenge garbage // IO #include #include #include #include #include // Utility #include #include #include #include #include #include // Data structures #include #include #include #include #include #include #include #include // I want easy access to STL and things like hash_map using namespace std; using namespace std::tr1; using namespace __gnu_cxx; // Needed for hash_map namespace __gnu_cxx { template<> struct hash { size_t operator()(const std::string& x) const { return hash()(x.c_str()); } }; } typedef vector vi; typedef pair pii; typedef vector vpii; // }}} void printPair(const pii& pair) { if (pair.first < pair.second) cout << pair.first << " " << pair.second; else cout << pair.second << " " << pair.first; cout << endl; } int main() { long cases; cin >> cases; while (cases--) { long people; cin >> people; vi source; vpii sends; vi returns; while (people--) { vi::value_type temp; cin >> temp; source.push_back(temp); } sort(source.begin(), source.end()); int accumulated(0); while (source.size() >= 4) { int x1(source[0]), x2(source[1]), x3(source[source.size()-1]), x4(source[source.size()-2]); int sumStrategy1(max(x1, x4) + x1 + max(x1, x3) + x1), sumStrategy2(max(x1, x2) + x1 + max(x3, x4) + x2); if (sumStrategy1 < sumStrategy2) { sends.push_back(pii(x1, x4)); sends.push_back(pii(x1, x3)); returns.push_back(x1); returns.push_back(x1); accumulated += sumStrategy1; } else { sends.push_back(pii(x1, x2)); returns.push_back(x1); sends.push_back(pii(x3, x4)); returns.push_back(x2); accumulated += sumStrategy2; } source.erase(source.end()-2, source.end()); } if (3 == source.size()) { // special case, only happens if we had exactly 3 to start sends.push_back(pii(source[0], source[2])); returns.push_back(source[0]); sends.push_back(pii(source[0], source[1])); accumulated += accumulate(source.begin(), source.end(), 0); } else if (2 == source.size()) { // remainder after 4+ sends.push_back(pii(source[0], source[1])); accumulated += source[1]; } if (1 == source.size()) { // special case; only happens if we had exactly 1 to begin with cout << source[0] << endl << source[0] << endl; } else { cout << accumulated << endl; for (vi::size_type i(0); i < sends.size(); ++i) { printPair(sends[i]); if (i < returns.size()) cout << returns[i] << endl; } } if (cases) cout << endl; } return 0; }