import
java.util.*;
import
java.util.stream.Collectors;
public
class
Main {
static
List<Integer> best_remove(List<Integer> left, List<Integer> right,
int
n) {
List<Integer> temp =
new
ArrayList<>();
PriorityQueue<Integer> leftHeap =
new
PriorityQueue<>(left);
PriorityQueue<Integer> rightHeap =
new
PriorityQueue<>(right);
if
(left.size() == n && right.size() > n)
{
temp.addAll(rightHeap.stream().sorted(Collections.reverseOrder()).limit(n).collect(Collectors.toList()));
}
else
if
(right.size() == n && left.size() > n)
{
temp.addAll(leftHeap.stream().limit(n).collect(Collectors.toList()));
}
else
{
int
x = left.size() - n;
temp.addAll(leftHeap.stream().limit(n - x).collect(Collectors.toList()));
temp.addAll(rightHeap.stream().sorted(Collections.reverseOrder()).limit(x).collect(Collectors.toList()));
}
return
temp;
}
static
List<Integer> remove_elements(List<Integer> parent, List<Integer> child) {
List<Integer> result =
new
ArrayList<>();
Map<Integer, Integer> childCount =
new
HashMap<>();
for
(Integer i : child) {
int
count = childCount.getOrDefault(i,
0
);
childCount.put(i, count +
1
);
}
for
(Integer i : parent) {
if
(childCount.containsKey(i) && childCount.get(i) >
0
) {
childCount.put(i, childCount.get(i) -
1
);
}
else
{
result.add(i);
}
}
return
result;
}
static
int
max_diff(List<Integer> arr,
int
n) {
int
mid = arr.size() /
2
;
int
left = arr.subList(
0
, mid).stream().mapToInt(Integer::intValue).sum();
int
right = arr.subList(mid, arr.size()).stream().mapToInt(Integer::intValue).sum();
return
left - right +
1
;
}
public
static
void
main(String[] args) {
List<Integer> arr = Arrays.asList(
7
,
9
,
5
,
8
,
1
,
3
);
int
n = arr.size() /
3
;
int
final_max = Integer.MIN_VALUE;
for
(
int
i = n; i <=
2
* n; i++) {
List<Integer> left = arr.subList(
0
, i);
List<Integer> right = arr.subList(i, arr.size());
List<Integer> bestRemoveElements = best_remove(left, right, n);
List<Integer> dup =
new
ArrayList<>(arr);
List<Integer> removeElements = remove_elements(dup, bestRemoveElements);
int
currMax = max_diff(removeElements, n);
final_max = Math.max(final_max, currMax);
}
System.out.println(
"The maximum difference between S1 and S2 is "
+ final_max);
}
}