Latar Belakang
Bayangkan sejenak bahwa Anda memiliki pekerjaan yang menjemukan. Setiap pagi, Anda diberi koleksi tugas yang harus Anda kerjakan pada hari itu. Setiap tugas memiliki durasi tertentu, dan sekali dimulai, itu harus diselesaikan dalam sekali jalan. Bos Anda tidak akan mentolerir pemalasan, jadi jika ada tugas yang masih bisa Anda selesaikan sebelum pulang, Anda harus mengerjakan salah satu dari mereka (Anda dapat memilih yang mana). Sebaliknya, jika semua tugas yang tersisa mengharuskan Anda bekerja lembur, Anda harus pulang lebih awal! Dengan demikian tujuan Anda adalah untuk meminimalkan lamanya hari kerja Anda dengan penjadwalan yang cerdas.
Fakta menyenangkan: ini adalah salah satu varian dari masalah penjadwalan birokrat yang malas , dan itu adalah NP-hard ( sumber ).
Memasukkan
Anda memiliki dua input: jumlah "unit waktu" di hari kerja Anda (bilangan bulat positif L
), dan kumpulan tugas (array bilangan positif yang tidak kosong T
, mewakili durasi tugas). Mereka dapat diambil dalam urutan apa pun, dan dalam format apa pun yang wajar. Array T
dapat berisi tugas dengan durasi lebih dari L
, tetapi dijamin mengandung setidaknya satu tugas dengan durasi paling banyak L
.
Keluaran
Sebuah jadwal yang berlaku adalah bagian dari tugas S ⊆ T
sehingga sum(S) ≤ L
, dan setiap tugas tidak di S
(penghitungan multiplicities) memiliki durasi ketat lebih dari L - sum(S)
. Output Anda akan menjadi jumlah terkecil dari jadwal yang valid. Dengan kata lain, Anda harus menampilkan jumlah minimal unit waktu yang harus Anda pakai hari ini.
Contoh
Pertimbangkan inputnya
L = 9
T = [3,4,4,4,2,5]
Salah satu cara penjadwalan hari Anda adalah [4,4]
: Anda menyelesaikan dua tugas dalam 8 unit waktu, dan memiliki 1 unit tersisa. Karena tidak ada tugas 1 unit yang tersedia, Anda dapat pulang. Namun, jadwalnya [2,5]
bahkan lebih baik: Anda bekerja untuk 7 unit waktu, dan kemudian semua tugas yang tersisa akan membutuhkan 3 unit waktu atau lebih. Jadwal [2,4]
tidak valid, karena setelah bekerja untuk 6 unit waktu, Anda masih punya cukup waktu untuk menyelesaikan tugas 3 unit. 7 unit ternyata menjadi optimal, sehingga output yang benar adalah 7
.
Aturan dan penilaian
Anda dapat menulis program lengkap atau fungsi. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Tidak ada batas waktu, jadi pemaksaan kasar dapat diterima dengan sempurna.
Uji kasus
Ini diberikan dalam format 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