HackerEarth - Hunger Games Solution
You have reached the final level of Hunger Games and as usual a tough task awaits you. You have a circular dining table and N hungery animals.You need to place them on the table.Each animal has a hunger value.
You can place the animals in any order on the circular table.Once you place them you need to calculate the Danger value of your arrangement.
The danger value of the arrangement is the maximum difference of hunger values of all the adjacent seated animals.You need to keep this danger value as low as possible.
The first line contains N integers.
The second line contains the hunger values of N animals.
Print the minimum possible danger value.
4 5 10 6 8
The optimal arrangement is :
5 / \ 6 8 \ / 10
The adjacent pair values are 1 for(6-5),3 for(8-5),4 for(10-6),2 for(10-8).Since danger value is the maximum value so it's 4.
Solution in Python
from collections import deque n = int(input()) a = list(map(int,input().split())) d = deque() for index,value in enumerate(sorted(a)): d.appendleft(value) if index%2 else d.append(value) print(max(abs(d[i]-d[i-1]) for i in range(0,len(d))))
The algorithm to minimize the adjacent difference is very simple.
Let us array be arr = [1, 3, 5, 7, 4, 9, 2]
First we will sort the number
>>> sorted(arr) [1, 2, 3, 4, 5, 7, 9]
Now create a new array and insert the sorted elements to end and beginning turn by turn.
d =  Insert 1 to end d =  Insert 2 to beginning d = [2,1] Insert 3 to end d = [2,1,3] Insert 4 to beginning d = [4,2,1,3] Insert 5 to end d = [4,2,1,3,5] Insert 7 to beginning d = [7,4,2,1,3,5] Insert 9 to end d = [7,4,2,1,3,5,9]
That's it pretty simple.
We can do this with simple list by using arr.insert(0, value) to insert in the beginning and arr.append(value) to append to the end. Inserting element to end in python list is fast O(1) but inserting elements to beginning of a python list is very slow O(n). As the number of element increases our list keeps getting slower and slower.
That's why we will use deque(double ended queue) instead , and then we can use arr.appendleft(value) to insert in the beginning and arr.append(value) to append to the end.
In deque both ends of a list are accessible very fast both O(1)
d = deque() for index,value in enumerate(sorted(a)): d.appendleft(value) if index%2 else d.append(value)
Now that we have got our array with minimized adjacent values, we just have to calculate the adjacent difference of all our array elements.
print(max(abs(d[i]-d[i-1]) for i in range(0,len(d))))