1058 最小化捨入誤差以滿足目標

2021-10-25 04:17:27 字數 1840 閱讀 2504

題目描述:

給定一系列** [p1,p2…,pn] 和乙個目標 target,將每個** pi 捨入為 roundi(pi) 以使得捨入陣列 [round1(p1),round2(p2)…,roundn(pn)] 之和達到給定的目標值 target。每次捨入操作 roundi(pi) 可以是向下舍 floor(pi) 也可以是向上入 ceil(pi)。

如果捨入陣列之和無論如何都無法達到目標值 target,就返回 -1。否則,以保留到小數點後三位的字串格式返回最小的捨入誤差,其定義為 σ |roundi(pi) - (pi)|( i 從 1 到 n )。

示例 1:

輸入:prices = [「0.700」,「2.800」,「4.900」], target = 8

輸出:「1.000」

解釋:使用 floor,ceil 和 ceil 操作得到 (0.7 - 0) + (3 - 2.8) + (5 - 4.9) = 0.7 + 0.2 + 0.1 = 1.0 。

示例 2:

輸入:prices = [「1.500」,「2.500」,「3.500」], target = 10

輸出:"-1"

解釋:達到目標是不可能的。

1 <= prices.length <= 500

表示**的每個字串 prices[i] 都代表乙個介於 0 和 1000 之間的實數,並且正好有 3 個小數字。

target 介於 0 和 1000000 之間。

方法1:

主要思路:

(1)先對數字進行向下取整,並從target中減去對應的數字,然後將字串後三位字元轉成對應的數字,若非零,則進行儲存;

(2)判斷target是否小於0,若小於0,說明全部向下取整也不能獲得需要的數字,返回-1,判斷target是否大於nums.size(),若大於,說明即使全部向上取整,也達不到需要的數字,返回-1;

(3)若在兩者之間,說明可以通過向上或向下取整獲得;

(4)則對獲得的小數點後的數字進行降序排序,然後在遍歷該降序陣列的同時,判斷target是否大於0,若大於,則需要將該降序陣列當前數字相當於向上取整,這樣相當於是在用貪心的思想,將捨入誤差盡量的最小化;

class

solution

}//判斷是否不能達到給定值

if(target>nums.

size()

||target<0)

//將小數部分進行降序排序

sort

(nums.

begin()

,nums.

end(),

(int

& lhs,

int& rhs));

//使用貪心的思想,將給定 target 減到0,同時獲得最小的輸入誤差

int diff=0;

for(

int& n:nums)

else

}//將獲得最小的捨入誤差轉成需要的格式

string tmp=

to_string

(diff);if

(tmp.

size()

<4)

return

"0."

+tmp;

}//值比較大的情形

return tmp.

substr(0

,tmp.

size()

-3)+

"."+tmp.

substr

(tmp.

size()

-3);

}};

最小化安裝 Ubuntu

ubuntu 的預設安裝方式或許並不為所有使用者所接受。譬如說吧,有的使用者並不想使用 gnome 桌面環境,也有的使用者並不需要預先安裝的所有軟體。為了解決上述諸如此類的問題,在安裝最小化的 ubuntu 的基礎上,根據各人之喜好執行定製化安裝,可能是較好的折中方案。首先,安裝 ubuntu 基本...

經驗風險最小化

前面提到,機器學習的目的就是根據一些訓練樣本 尋找乙個最優的函式,使得函式對輸入 x的估計y 與實際輸出y之間的期望風險 可以暫時理解為誤差 最小化。期望風險最小化 依賴於樣本的輸入 x與其輸出 y之間的函式對映關係f x,y 而這個對映關係,在機器視覺和模式識別系統中,一般指代先驗概率和類條件概率...

最小化到托盤

notifyicon notifyicon1 void inittraymenu 在建構函式時呼叫此函式 void notifyicon1 click object sender,eventargs e private void menuitem1 click object sender,syste...