題目連結:
題目意譯:
你被給定兩個整數 memory1 和 memory2 代表著在兩個 MS 記憶卡(Memory Stick)中的可用位元記憶體數量。現在有一個有著缺陷的程式正在執行中,其每秒所使用的記憶體數量漸漸遞增。
在第 i 秒(從 1 開始), i 位元的記憶體被配置給有著更多可以記憶體的記憶卡上(或者直接是給第一個記憶卡,如果兩個記憶卡有著相同數量的可用記憶體)。如果兩個記憶卡都沒有至少 i 位元的可用記憶體,則程式將會當掉。
回傳一個陣列包含 [crashTime, memory1crash, memory2crash] 之資訊,其中 crashTime 為程式當掉的時間(以秒數計)而 memory1crash 和 memory2crash 為第一和第二個記憶卡此時各自有的可用位元記憶體數量。
限制:
0 ≦ memory1 、 memory2 ≦ 2 ^ 31 - 1
範例測資:
範例 1:
輸入: memory1 = 2, memory2 = 2
輸出: [3,1,0]
解釋: 記憶體配置狀況如下:
- 在第 1 秒裡, 1 位元記憶體配置給記憶卡 1 。第一個記憶卡現在有著 1 位元的可用記憶體。
- 在第 2 秒裡, 2 位元記憶體配置給記憶卡 2 。第二個記憶卡現在有著 0 位元的可用記憶體。
- 在第 3 秒裡,程式當掉了。記憶卡各自有著 1 和 0 位元記憶體可用。
範例 2:
輸入: memory1 = 8, memory2 = 11
輸出: [6,0,4]
解釋: The memory is allocated as follows:
- 在第 1 秒裡, 1 位元記憶體配置給記憶卡 2 。第二個記憶卡現在有著 10 位元的可用記憶體。
- 在第 2 秒裡, 2 位元記憶體配置給記憶卡 2 。第二個記憶卡現在有著 8 位元的可用記憶體。
- 在第 3 秒裡, 3 位元記憶體配置給記憶卡 1 。第一個記憶卡現在有著 5 位元的可用記憶體。
- 在第 4 秒裡, 4 位元記憶體配置給記憶卡 2 。第二個記憶卡現在有著 4 位元的可用記憶體。
- 在第 5 秒裡, 5 位元記憶體配置給記憶卡 1 。第一個記憶卡現在有著 0 位元的可用記憶體。
- 在第 6 秒裡,程式當掉了。記憶卡各自有著 0 和 4 位元記憶體可用。
解題思維:
模擬即可。因為每秒會比上一秒所需的記憶體多 1 ,所以總記憶體所耗為 1 + 2 + ……,可以看到其不會超過 95000 項,因為 (1 + 95000) × 95000 ÷ 2 = 4512547500 > 2 ^ 32。
因此我們從第 1 秒開始數。當我們在第 i 秒時,我們判斷 memory1 與 memory2 的大小關係。如果 memory1 ≧ memory2 ,則我們使用 memory1 來配置 i 位元的記憶體,因此 memory1 要減去 i ;反之如果 memory1 < memory2 ,則將 memory2 減去 i 。
重複以上步驟直到,memory1 和 memory2 都 < i 為止。此時的 i 、 memory1 、 memory2 之值即為所求的 crashTime 、 memory1crash 和 memory2crash 。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。