The Bridge and Torch Problem
Python 3, 100 99 bytes

a recursive solution

f=lambda s:s[0]+s[-1]+min(2*s[1],s[0]+s[-2])+f(s[:-2])if s.sort()or 3&lt;len(s)else sum(s[len(s)==2:])


Thanks to @xnor for this paper

Thanks to @lirtosiast save 2 bytes,  @movatica save 1 bytes and to @gladed pointing at that my previous solution doesn't work

use the following trick to evaluate something in lambda function s.sort() or s  here we compute sort and return the result of the test s.sort()or len(s)&gt;3

Ungolfed

def f(s):
    s.sort()                                   # sort input in place
    if len(s)&gt;3:                               # loop until len(s) &lt; 3
        a = s[0]+s[-1]+min(2*s[1],s[0]+s[-2])  # minimum time according to xnor paper
        return  a + f(s[:-2])                  # recursion on remaining people
    else:
        return sum(s[len(s)==2:])              # add last times when len(s) &lt; 3


Results

&gt;&gt;&gt; f([3, 1, 6, 8, 12])
29
&gt;&gt;&gt; f([1, 2, 5, 8])
15
&gt;&gt;&gt; f([5])
5
&gt;&gt;&gt; f([1])
1
&gt;&gt;&gt; f([1, 3, 4, 5])
14