バックグラウンド
ちょっとした退屈な仕事があると想像してください。毎朝、その日に作業すべきタスクのコレクションが提供されます。各タスクには一定の期間があり、一度開始すると、一度に完了する必要があります。上司はアイドリングを許容しないので、家に帰る前にまだ完了できるタスクがある場合は、そのうちの1つで作業する必要があります(どちらを選択するかは選択できます)。逆に、残りのすべてのタスクで残業が必要な場合は、早めに帰宅してください!したがって、あなたの目標は、賢明なスケジューリングにより、勤務時間を最小限に抑えることです。
楽しい事実:これは、怠zyな官僚のスケジューリング問題の 1つのバリアントであり、NPハード(ソース)です。
入力
2つの入力があります:就業日の「時間単位」の数(正の整数L
)、およびタスクのコレクション(T
タスクの継続時間を表す、空でない正の整数の配列)。それらは、任意の順序で、合理的な形式で服用できます。配列にT
は、期間がを超えるタスクが含まれることがありますが、期間が最大L
で少なくとも1つのタスクが含まれることが保証されますL
。
出力
有効なスケジュールは、タスクのサブセットであるS ⊆ T
ようにsum(S) ≤ L
していない、そしてすべてのタスクS
(カウント多重度)、厳密以上の持続時間を有しますL - sum(S)
。あなたの出力は、有効なスケジュールの可能な限り最小の合計となります。言い換えれば、今日作業しなければならない時間単位の最小数を出力しなければなりません。
例
入力を検討する
L = 9
T = [3,4,4,4,2,5]
1日をスケジュールする1つの方法は、[4,4]
2つのタスクを8つの時間単位で完了し、1つの単位を残すことです。1ユニットのタスクは利用できないため、家に帰ることができます。ただし、スケジュール[2,5]
はさらに優れています。7時間単位で作業すると、残りのタスクはすべて3時間単位以上かかります。[2,4]
6時間単位で作業した後でも、3単位タスクを完了するのに十分な時間があるため、スケジュールは無効です。7ユニットが最適であることが判明したため、正しい出力は7
です。
ルールとスコアリング
完全なプログラムまたは関数のいずれかを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。時間制限はないため、ブルートフォースは完全に受け入れられます。
テストケース
これらは形式で与えられますL T -> output
。
1 [1,2] -> 1
6 [4,1] -> 5
7 [7,7,9] -> 7
9 [3,4,4,4,2,5] -> 7
20 [6,2,3,12,7,31] -> 17
42 [7,7,7,7,8,8,8] -> 36
42 [7,7,7,7,7,8,8,8] -> 35
42 [7,7,7,7,7,7,8,8,8] -> 36
16 [1,2,3,4,5,6,7,8,9,10] -> 13
37 [15,27,4,1,19,16,20,26,29,18] -> 23
22 [24,20,8,8,29,16,5,5,16,18,4,9] -> 18
80 [10,22,11,2,28,20,27,6,24,9,10,6,27,2,15,29,27] -> 71
59 [26,28,5,4,7,23,5,1,9,3,7,15,4,23,7,19,16,25,26] -> 52