第1版:2023年9月9日
第2版:2024年12月21日
作者:王一哲
題目來源:107年6月實作題
ZeroJudge 題目連結
你是個櫃子租借商,總共擁有 個櫃子。現在這 個櫃子分別被 個人借用,借用量分別為 個櫃子,其中 。
現在你想要使用 個空櫃子,在被借用的櫃子只能夠全退或全不退之下,最少需要請這 N 個人退還多少櫃子?也就是當有一個人借用10個櫃子時,不能夠只請他退還5個櫃子。
舉例來說,對於 個櫃子,現在分別被5個人借用 (1, 7, 2, 8, 2) 個櫃子,在需要使用 個櫃子之下,最少需要請他們退還 個櫃子。
第一行有三個正整數 、、,分別代表櫃子總數 、想要使用的櫃子數 、借用人數 。
第二行有 個非負整數 ,代表每個人所借用的櫃子數量。
其中 。
最少需要請這 個人退還的櫃子總數
以下的程式碼主要參考這個網頁,使用 bitset 求指定資料可能的總合主要參考 LeetCode 416. Partition Equal Subset Sum 討論區 C++ Bitset Solution。其中最難理解的部分是第3、4行,以 ZeroJudge 網頁的範例來說明,由於已借出的格子數為 ,可能的總合有 ,如果 possSum 先設定為1,先將 possSum 向左移1位再與原本的值取 or 運算,其2進位值為
這代表 possSum 可能為 1。接下來再向左平移7位並與原本的值取 or 運算,其2進位值為
這代表 possSum 可能為 1、7、8,也就是看2進位值中哪幾個位數是1,就代表總合可能是這幾個位數。接下再代入 2、8、2 的結果依序為
再由最後一位向前搜尋字串1,如果 target 對應的位數不是1,再繼續向前找,找到的位數就是答案。
於 ZeroJudge 測試結果,最長運算時間約為 44 ms,使用記憶體最多約為 3.5 MB,通過測試。
於 ZeroJudge 測試結果,有6筆測資需要的記憶體爆掉。
於 ZeroJudge 測試結果,最後一筆測資超時。
於 ZeroJudge 測試結果,最長運算時間約為 7 ms,使用記憶體最多約為 704 kB,通過測試。
於 ZeroJudge 測試結果,最長運算時間約為 39 ms,使用記憶體最多約為 39.4 MB,通過測試。
於 ZeroJudge 測試結果,最長運算時間約為 17 ms,使用記憶體最多約為 1.1 MB,通過測試。
APCS
、Python
、C++