この質問は、DPの+貪欲良い質問です。
最初のソートを行うのは必須です。
その後、我々は状況を分割します:
1.残した人であれば、のは最低限の彼を迎えに戻って来てみましょう
二人が残っ2.場合は、のは、最小のために戻って来るように、残りの2人の男性(すなわち、2人の最大)過去に、バックので、少しの時間、過去2で最小
最大人が配達の最小、あるいは第2大とせるため、上記の二つの方法は、最適でなければなりません。
上記の式の意味は、DP変換されます。
1.F [I] = F [I-1] + [1] + [N]。
2.F [I] = F [I-2] + [1] + [I-1] + [2] + [2]。
また、国境に対処するために注意を払います。
<ビット/ STDC ++ H>の#include の#define INC(A、B、C)のための(iは= intを登録する; iは= bを<; I + = C) の#define 100010 INI INT [INI]、F [INI] ; 使用して 名前空間はstdを、 INT のmain() { int型のn; cinを>> N; INC(1、nは、1)のscanf(" %dの"、および[I])。 ソート( + 1、A + 1個の + N)。 fは、[ 1 ] = [ 1 ]。 fは[ 2 ] = [ 2 ]。 INC(3、N、1 ){ F [I] =分(F [I- 1 ] + [ 1 ] + [I]、F [I- 2 ] + 2 * [ 2 ] + [i]は+ [ 1 ] ); } COUT << F [N]。 }