我有這個 python 函式問題,我似乎無法理解。撰寫一個函式,獲取價格串列prices,并找到每個價格的下限或上限,price[i]以使調整后的小計總和等于四舍五入的總價,并且調整后的小計也盡可能接近原始小計。從數學上講,您應該最小化調整后的小計與原始小計的絕對差值之和。回傳帶有調整后的小計的串列。(是的,一口,對)
示例輸入:
prices: [5.40, 3.30, 5.00]
示例輸出:
[6, 3, 5]
解釋:
5.40 3.30 5.00 = 13.70
13.70 is rounded to 14
The way to get 14 while adjusting the prices the least is ceil(5.40) and floor(3.30).
下面的代碼是據我所知,我不確定接下來會發生什么
prices = [5.40,3.30, 5.00]
total_price = 0
for price in prices:
total_price =price
total_avg = round(total_price)
print("total_avg:",total_avg)
prices.sort()
min_price = prices[0]
max_price = prices[-1]
print("min_price:",min_price)
print("max_price:",max_price)
>>>total_avg: 14
>>>min_price: 3.3
>>>max_price: 5.4
uj5u.com熱心網友回復:
我們可以輕松地在 O(nlog(n)) 時間內做到這一點。首先我們計算沒有小數的數字的總和,然后我們計算所需的四舍五入的總和,我們找出它們的差異。然后,我們按升序對它們的差異值進行排序,然后我們得到那些具有較高小數的數字的 ceil,因此它們的絕對差異被最小化,并得到那些具有較低小數的數字的下限。我們使用二進制搜索來找出那些具有較高十進制值的數字。這些 bisect 呼叫中的每一個都將花費 log(n) 時間,因此我們的整體復雜度為 nLog(n),并且仍然保留了陣列的整體順序。
import math
import bisect
prices = [5.40,3.30, 5.00]
ans = round(sum(prices))
pure_sum = sum([math.floor(i) for i in prices])
diff = ans-pure_sum
abs_diff = sorted([i-math.floor(i) for i in prices if (i%1!=0)])
for i in range(len(prices)):
if bisect.bisect(abs_diff,prices[i]-math.floor(prices[i])) > diff:
prices[i] = math.ceil(prices[i])
else:
prices[i] = math.floor(prices[i])
print(prices)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523856.html
標籤:Python算法
上一篇:計算總和為給定值的所有唯一四元組-N^3復雜度演算法是否已知?
下一篇:陣列中所有可能的數字對的差異
