Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ---------------------------------------------------------------------------------------- */
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <cstdlib>
- #include <climits>
- #include <cstring>
- #include <iomanip>
- #include <limits>
- #include <string>
- #include <locale>
- #include <cstdio>
- #include <vector>
- #include <cmath>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <ctime>
- #include <map>
- #include <set>
- using namespace std;
- #define fi first
- #define se second
- #define mp make_pair
- #define pb push_back
- #define rp(i, n) for (int i = 0; i < (n); ++i)
- #define rd(i, n) for (int i = (n); i--;)
- #define rs(i, x) rp (i, sz (x))
- #define fr(i, a, b) for (int i = (a); i <= (b); ++i)
- #define fd(i, a, b) for (int i = (a); i >= (b); --i)
- #define fe(i, x) for (__typeof ((x).begin ()) i = (x).begin (); i != (x).end (); ++i)
- #define fer(i, x) for (__typeof ((x).rbegin ()) i = (x).rbegin (); i != (x).rend (); ++i)
- #define cd(x) while ((x)--)
- #define nt(n) for (int i = (n); i--;)
- #define srt(v) sort (all (v))
- #define mn(x, y) x = min (x, y)
- #define mx(x, y) x = max (x, y)
- #define sz(x) (int) (x).size ()
- #define all(x) (x).begin (), (x).end ()
- #define cl(x) memset (x, 0, sizeof (x))
- #define sqr(x) ((x) * (x))
- const double pi = acos(-1.0);
- typedef unsigned long long llu;
- typedef long long ll;
- typedef pair <int, int> ii;
- typedef vector <string> vs;
- typedef vector <ii> vii;
- typedef vector <int> vi;
- typedef vector <vi> vvi;
- typedef vector <vii> vvii;
- typedef vector <bool> vb;
- typedef vector <vb> vvb;
- template <class T>
- inline string ns (const T &number)
- {
- stringstream ss;
- ss << number;
- return ss.str ();
- }
- template <class T>
- inline T sn (const string &text)
- {
- stringstream ss (text);
- T result;
- return ss >> result ? result : 0;
- }
- /* ---------------------------------------------------------------------------------------- */
- vi pSet;
- void init (const int &n)
- {
- pSet.resize (n);
- rp (i, n) pSet [i] = i;
- }
- int find (const int &x)
- {
- return pSet [x] == x ? x : pSet [x] = find (pSet [x]);
- }
- inline bool unionSet (const int &x, const int &y)
- {
- int xRoot = find (x), yRoot = find (y);
- if (xRoot != yRoot)
- {
- pSet [yRoot] = xRoot;
- return true;
- }
- return false;
- }
- int main ()
- {
- srand (time (NULL));
- #ifndef ONLINE_JUDGE
- freopen ("1235.inp", "r", stdin);
- freopen ("1235.check", "w", stdout);
- //freopen ("err.txt", "w", stderr);
- #endif
- int t; cin >> t;
- cd (t)
- {
- int n; cin >> n;
- vs key (n);
- typedef pair <int, pair <int, int> > cost;
- priority_queue <cost, vector <cost>, greater <cost> > pq;
- int res = 100;
- rp (i, n)
- {
- cin >> key [i];
- int tmp = 0;
- rp (j, 4)
- {
- key [i][j] -= '0';
- tmp += min <int> (key [i][j], 10 - key [i][j]);
- }
- mn (res, tmp);
- rp (j, i)
- {
- tmp = 0;
- rp (k, 4) tmp += min ((10 + key [i][k] - key [j][k]) % 10, (10 + key [j][k] - key [i][k]) % 10);
- pq.push (mp (tmp, mp (i, j)));
- }
- }
- init (n);
- int cnt = n - 1;
- while (cnt)
- {
- cost tmp = pq.top ();
- pq.pop ();
- if (unionSet (tmp.se.fi, tmp.se.se))
- {
- --cnt;
- res += tmp.fi;
- }
- }
- cout << res << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment