Skip to content

Commit aaaff6d

Browse files
authored
Merge pull request IIdroyII#32 from Bhojraj9022/tog_of_war_problem
Tug of War problem Solution
2 parents 1ae67c4 + 75d55d6 commit aaaff6d

1 file changed

Lines changed: 163 additions & 0 deletions

File tree

tog_of_war_Problem.cpp

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
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

Comments
 (0)