Bricks and Bags (Codeforces 1740C)
Tags: Greedy, games

There are $$$n$$$ bricks numbered from $$$1$$$ to $$$n$$$. Brick $$$i$$$ has a weight of $$$a_i$$$.Pak Chanek has $$$3$$$ bags numbered from $$$1$$$ to $$$3$$$ that are initially empty. For each brick, Pak Chanek must put it into one of the bags. After this, each bag must contain at least one brick.After Pak Chanek distributes the bricks, Bu Dengklek will take exactly one brick from each bag. Let $$$w_j$$$ be the weight of the brick Bu Dengklek takes from bag $$$j$$$. The score is calculated as $$$|w_1 - w_2| + |w_2 - w_3|$$$, where $$$|x|$$$ denotes the absolute value of $$$x$$$.It is known that Bu Dengklek will take the bricks in such a way that minimises the score. What is the maximum possible final score if Pak Chanek distributes the bricks optimally?

Input: Each test contains multiple test cases. The first line contains an integer $$$t$$$ ($$$1 \leq t \leq 2 \cdot 10^4$$$) — the number of test cases. The following lines contain the description of each test case.The first line of each test case contains an integer $$$n$$$ ($$$3 \leq n \leq 2 \cdot 10^5$$$) — the number of bricks.The second line of each test case contains $$$n$$$ integers $$$a_1, a_2, \ldots, a_n$$$ ($$$1 \leq a_i \leq 10^9$$$) — the weights of the bricks.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, output a line containing an integer representing the maximum possible final score if Pak Chanek distributes the bricks optimally.

Note: In the first test case, one way of achieving a final score of $$$6$$$ is to do the following:   Put bricks $$$1$$$, $$$4$$$, and $$$5$$$ into bag $$$1$$$.  Put brick $$$3$$$ into bag $$$2$$$.  Put brick $$$2$$$ into bag $$$3$$$. If Pak Chanek distributes the bricks that way, a way Bu Dengklek can take the bricks is:   Take brick $$$5$$$ from bag $$$1$$$.  Take brick $$$3$$$ from bag $$$2$$$.  Take brick $$$2$$$ from bag $$$3$$$. The score is $$$|a_5 - a_3| + |a_3 - a_2| = |3 - 5| + |5 - 1| = 6$$$. It can be shown that Bu Dengklek cannot get a smaller score from this distribution.It can be shown that there is no other distribution that results in a final score bigger than $$$6$$$.

Sample Inputs:
3
5
3 1 5 2 3
4
17 8 19 45
8
265 265 265 265 265 265 265 265

Sample Outputs:
6
63
0

Solution (Python):
import sys

def solve():
    n = int(input())
    a = list(map(int, input().split()))
    a.sort()
    res = 0
    for i in range(0, n - 2):
        res = max(res, a[i + 1] - a[i] + a[-1] - a[i])
    for i in range(1, n - 1):
        res = max(res, a[i + 1] - a[i] + a[i + 1] - a[0])
    print(res)
t = int(input())
for _ in range(t):
    solve()

Solution (Python):
def bricks(arr):
    arr.sort()
    res = arr[-1] - arr[0]
    for i in range(2, len(arr)):
        res = max(res, arr[i] * 2 - arr[i - 1] - arr[0])
    arr.reverse()
    for i in range(2, len(arr)):
        res = max(res, abs(arr[i] * 2 - arr[i - 1] - arr[0]))
    return res
testcases = range(int(input()))
for case in testcases:
    input()
    print(bricks([int(i) for i in input().split(' ')]))

Solution (Python):
import sys
sys.setrecursionlimit(1000000000)

def solve(n, a):
    a.sort()
    res = 0
    for i in range(n):
        if i <= n - 3:
            res = max(res, a[i + 1] - a[i] + a[-1] - a[i])
        if i >= 2:
            res = max(res, a[i] - a[i - 1] + a[i] - a[0])
    return res
t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    res2 = solve(n, a)
    print(res2)