1+ #include < bits/stdc++.h>
2+
3+ #define ll long long int
4+ #define ld long double
5+
6+ using namespace std ;
7+
8+ void file_io ()
9+ {
10+ ios_base::sync_with_stdio (false );
11+ cin.tie (NULL );
12+ #ifndef ONLINE_JUDGE
13+ freopen (" input.txt" , " r" , stdin);
14+ freopen (" output.txt" , " w" , stdout);
15+ #endif
16+ }
17+
18+ class ThreeVal
19+ {
20+ public:
21+ bool True, False, None;
22+
23+ ThreeVal ()
24+ {
25+ True = false ;
26+ False = false ;
27+ None = false ;
28+ }
29+
30+ void setTrue ()
31+ {
32+ True = true ;
33+ False = false ;
34+ None = false ;
35+ }
36+
37+ void setFalse ()
38+ {
39+ False = true ;
40+ True = false ;
41+ None = false ;
42+ }
43+
44+ void setNone ()
45+ {
46+ None = true ;
47+ True = false ;
48+ False = false ;
49+ }
50+ };
51+
52+ void addPerson (vector<ll> *arr, ll n, vector<ThreeVal> *currentElements, ll noOfSelectedElements, vector<ThreeVal> *solution, ll *minimumDifference, ll sum, ll currentSum, ll currentPosition)
53+ {
54+ if (currentPosition == n)
55+ {
56+ return ;
57+ }
58+
59+ if (((n / 2 ) - noOfSelectedElements) > (n - currentPosition))
60+ {
61+ return ;
62+ }
63+ addPerson (arr, n, currentElements, noOfSelectedElements, solution, minimumDifference, sum, currentSum, currentPosition + 1 );
64+ noOfSelectedElements++;
65+ currentSum += (*arr)[currentPosition];
66+ (*currentElements)[currentPosition].setTrue ();
67+
68+ if (noOfSelectedElements == n / 2 )
69+ {
70+ if ((abs (sum / 2 ) - currentSum) < *minimumDifference)
71+ {
72+ *minimumDifference = abs (sum / 2 - currentSum);
73+ for (ll i = 0 ; i < n; i++)
74+ {
75+ (*solution)[i] = (*currentElements)[i];
76+ }
77+ }
78+ }
79+ else
80+ {
81+ addPerson (arr, n, currentElements, noOfSelectedElements, solution, minimumDifference, sum, currentSum, currentPosition + 1 );
82+ }
83+
84+ (*currentElements)[currentPosition].setFalse ();
85+ }
86+
87+ void tugOfWar (vector<ll> *arr, ll n)
88+ {
89+ vector<ThreeVal> *currentElements = new vector<ThreeVal>();
90+ for (ll i = 0 ; i < n; i++)
91+ {
92+ ThreeVal tv;
93+ tv.setNone ();
94+ currentElements->push_back (tv);
95+ }
96+
97+ vector<ThreeVal> *solution = new vector<ThreeVal>();
98+ for (ll i = 0 ; i < n; i++)
99+ {
100+ ThreeVal tv;
101+ tv.setNone ();
102+ solution->push_back (tv);
103+ }
104+
105+ ll minimumDifference = INT_MAX ;
106+
107+ ll sum = 0 ;
108+ for (ll i = 0 ; i < n; i++)
109+ {
110+ sum += (*arr)[i];
111+ (*currentElements)[i].setFalse ();
112+ (*solution)[i].setFalse ();
113+ }
114+
115+ addPerson (arr, n, currentElements, 0 , solution, &minimumDifference, sum, 0 , 0 );
116+
117+ ll sum1 = 0 , sum2 = 0 ;
118+
119+ for (ll i = 0 ; i < n; i++)
120+ {
121+ // cout << (*solution)[i].True << " " << (*solution)[i].False << " " << (*solution)[i].None << endl;
122+ if ((*solution)[i].True )
123+ {
124+ sum1 += (*arr)[i];
125+ }
126+
127+ if ((*solution)[i].False )
128+ {
129+ sum2 += (*arr)[i];
130+ }
131+ }
132+
133+ if (sum1 < sum2)
134+ {
135+ cout << sum1 << " " << sum2 << endl;
136+ }
137+ else
138+ {
139+ cout << sum2 << " " << sum1 << endl;
140+ }
141+ }
142+
143+ int main ()
144+ {
145+ file_io ();
146+ ll testCases;
147+ cin >> testCases;
148+ ll n, no;
149+ vector<ll> arr;
150+ while (testCases--)
151+ {
152+ arr.clear ();
153+ cin >> n;
154+ for (ll i = 0 ; i < n; i++)
155+ {
156+ cin >> no;
157+ arr.push_back (no);
158+ }
159+ tugOfWar (&arr, n);
160+ }
161+
162+ return 0 ;
163+ }
0 commit comments