using System.Collections.Generic;
public static void Main()
Console.WriteLine(QueueTime(new int[] { }, 1) == 0 ? "Passed" : "Failed");
Console.WriteLine(QueueTime(new int[] {1,2,3,4}, 2) == 5 ? "Passed" : "Failed");
Console.WriteLine(QueueTime(new int[] {2,3,4,2,3,4}, 2) == 9 ? "Passed" : "Failed");
Console.WriteLine(QueueTime(new int[] {1,2,3,4,5}, 100) == 5 ? "Passed" : "Failed");
Console.WriteLine(QueueTime(new int[] {5}, 1) == 5 ? "Passed" : "Failed");
Console.WriteLine(QueueTime(new int[] {2, 4, 5, 6}, 3) == 6 ? "Passed" : "Failed");
Console.WriteLine(QueueTime(new int[] {1,2,3,4,5}, 4) == 5 ? "Passed" : "Failed");
public static IEnumerable<int[]> permutate(int size, int[] input)
if (size <= 1) yield return input;
for (int i= 0; i < size; i++)
input[i] = input[size - 1];
foreach (var result in permutate(size - 1, input)) yield return result;
input[size-1] = input[i];
public static long QueueTime(int[] customers, int n)
var server_times = new long[n];
var best_time = long.MaxValue;
foreach (var permutation in permutate(customers.Length, customers))
for (int i = 0; i < n; i++) server_times[i] = 0;
for (int i = 0; i < permutation.Length; i++)
for (int j = 0; j < server_times.Length; j++)
if (server_times[j] < server_times[best_pos]) best_pos = j;
server_times[best_pos] += permutation[i];
if (server_times.Max() < best_time) best_time = server_times.Max();