Source: Magician and Chocolates
Problem Description
Given N bags, each bag contains Bi chocolates. There is a kid and a magician. In one unit of time, kid chooses a random bag i, eats Bi chocolates, then the magician fills the ith bag with floor(Bi/2) chocolates.
Find the maximum number of chocolates that kid can eat in A units of time.
NOTE:
- floor() function returns the largest integer less than or equal to a given number.
- Return your answer modulo 109+7
Input Format
First argument is an integer A.
Second argument is an integer array B of size N.
Output Format
Return an integer denoting the maximum number of chocolates that kid can eat in A units of time.
Example Input
Input 1:
A = 3 B = [6, 5]
Input 2:
A = 5 b = [2, 4, 6, 8, 10]
Example Output
Output 1:
14
Output 2:
33
Example Explanation
Explanation 1:
At t = 1 kid eats 6 chocolates from bag 0, and the bag gets filled by 3 chocolates. At t = 2 kid eats 5 chocolates from bag 1, and the bag gets filled by 2 chocolates. At t = 3 kid eats 3 chocolates from bag 0, and the bag gets filled by 1 chocolate. so, total number of chocolates eaten are 6 + 5 + 3 = 14
解題:
這題原理跟 InterviewBit – N max pair combinations 基本上一模一樣,但筆者極度不解的地方是:原始碼一模一樣,將其複製貼上到網站的 IDE 上執行會不斷出現 TLE ;但用 import heapq 的方式卻可以在不觸發 TLE 的情況下解題。覺得頭很痛。
另外還有一個神秘的地方是 heapq 模組內有針對 Max_heap 的 _heappop_max 程式,但對加入資料的 heappush 卻沒有相對應於 Max_heap 結構的 _heappush_max ,這樣在執行 heappush 的時候還不是會遇到一堆有的沒的錯誤要 debug…… 到底為何啊。
Code:
import heapq
class Solution:
# @param T : integer, how many times the kid eat chocolates
# @param chocs : list of integers
# @return an integer
def nchoc(self, T, chocs):
total_choc = 0
for i in range(len(chocs)):
chocs[i] = chocs[i] * -1
chocs = sorted(chocs)
for _ in range(T):
if not chocs: break
choc = heapq.heappop(chocs)
total_choc = (total_choc - choc) % (10**9 + 7)
#put chocs back
if (-choc)//2 < 1: continue
heapq.heappush(chocs, -((-choc)//2))
return total_choc
GitHub: GitHub