貪心和高精度

2021-09-11 06:49:35 字數 2860 閱讀 1953

分數揹包(部分揹包):有乙個容量為 v 的揹包和若干物品,物品有重

量和價值。假設物品可以被無限細分,且細分後價值重量比不變。求可

以裝下的最大價值。 

假設物品可以被無限細分,且細分後價值重量比不變。

貪心的做法:優先裝價效比高的物品,直到這種物品用完或揹包

裝滿

01 揹包:有乙個容量為 v 的揹包和若干物品,物品有重量和價值。物

品不能被分割。求可以裝下的最大價值。

貪心的做法:優先裝價效比高的物品?

反例:揹包容量為 4,三個物品的價值/重量分別為 3/30,2/19,2/19

可以使用動態規劃來解決

給出長度為 n 的整數序列 a1...an 和整數 x,每次操作可以使任意數字減

少 1,求最少操作多少次可以使所有相鄰兩個數字的和小於等於 x

從左往右按對考慮

對於 a1 和 a2,如果 a1 + a2 > x,那麼必須操作 a1 + a2 - x 次

減少 a2 相比減少 a1 更優,因為可能省下之後的操作

於是除非a1 本身已經大於 x,則只要減少 a2

依次向右重複操作,累加得到答案

if (a[1]>x) 

for (i=2;i<=n;i++)

if (a[i-1]+a[i]>x)

給出 n 個數字,需要分成若干組,每一組只能有 1 或 2 個數,且總和

不能超過 w,求最小組數

兩隊各有 n 個選手一對一進比賽,勝者得 2 分,平局各得 1 分,負

者不得分。給出每個選手的實力值,求安排一種順序使得自己隊得分

最高田忌賽馬 

如果最強的能戰勝對方最強的,那麼一定會安排這場比賽

如果最菜的能戰勝對方最菜的,那麼也一定會安排這場比賽

否則就把最菜的送給對方最強的(注意判斷平局) 

長度為 n 的整數序列 a1...n,每次操作可以選擇連續且不含零的一段減

少 1,求最少操作多少次可以全部變成0

從左往右考慮:對於 a1,至少要以 1 為左端點操作 a1 次

為了使這些操作的收益最大,需要盡量將它們的右端點向右移

如果 a1 ≤ a2,就向右延續,再額外加上 a2 - a1 次操作

如果 a1 > a2,有一些操作會被擋住,只有 a2 次可以繼續往右延伸

對原陣列差分,然後對大於零的元素進行求和得到答案

有 n 個人排隊接水,每個人花的時間不一樣。需要確定乙個接水的順

序,使得等待時間的平均值最小

要最小化等待時間的平均值,實際上就是最小化總的等待時間

總的等待時間 =∑ 每個一花的時間 × 排在他後面的人數

問題等價於給每個人分配乙個 0 ~ n - 1的權重,最小化帶權和

根據直覺,應該讓耗時較短的人擁有較小的權重(先打水),反之

亦然證明:對於任意兩個耗時不同的人,考慮交換它們的權重

實際上就是排序不等式

huffman 編碼

考慮這樣一種壓縮演算法:將每個字元用長短不一的二進位制數來表示,

滿足沒有任何乙個是另乙個的字首。

現在給出字元的出現次數,求能讓壓縮後總長度最短的編碼方式

我們發現,編碼可以構成一棵 trie 樹

壓縮後的總長度 = 每個字元出現次數 * 它的碼長(樹上到根的距

離)根據直覺,應該讓出現次數高的字元碼長更短,反之亦然

引理:存在一種最優方案,使得出現次數最少的兩個字元深度相

同,且在樹上為兄弟

那麼將這兩個字元合併,看成乙個字元,但每當它們出現時需要

額外的乙個碼長來分辨

遞迴地構建出 huffman 樹,得到最優編碼

數軸上有 n 個線段,給出左右端點,求可以選出的最多的不相交線段

(端點可以重合)。

考慮把選出的線段從左往右排成一排

對於最左邊的線段,我們希望它的右端點盡可能靠左,來留出更

多空間得到貪心演算法:按照右端點排序,從左到右,能選則選

正確性顯然

付錢問題 

有 1 元,2 元,5 元三種面額的錢,需要支付 n 元,求使用的最少錢幣

數. 按照 5,4,1 元依次付不太行 

反例:如果支付 8 元,5+1+1+1 不如 4+4

如果 n 較小,可以使用動態規劃

如果 n 很大,可以先貪心使用 5 元,直到可能出現反例開始動態規劃

給出棋盤上兩個點的座標,求馬(走馬字)從一點跳到另一點需要的最

少步數如果棋盤較小可以 bfs,但是本題中座標範圍很大 

大範圍進貪心,小範圍進行 bfs

小範圍也可以打表

高精度

通常,整數陣列來儲存數字(十進位制)的每一位

如果需要小數部分,可以再用乙個陣列來存

為了方便計算,一般按照十進位制從低位到高位的順序來存

a[0] 存個位,a[1] 存一位,a[2] 存百位

為了效率,可以進行壓位(乙個位置存多個十進位制位)

高精度加

乘卷積形式

ck=ai*bj  (i+j=k) 

高精度加法和高精度乘法

題目描述 谷學長有乙個非常簡單的問題給你,給你兩個整數a和b,你的任務是計算a b。輸入 輸入的第一行包含乙個整數t t 20 表示測試例項的個數,然後2 t行,分別表示a和b兩個正整數。注意整數非常大,那意味著你不能用32位整數來處理。你可以確定的是整數的長度不超過1000。輸出 對於每乙個樣例,...

大數相乘「高精度乘低精度」和「高精度乘高精度」

二 高精度乘高精度 如下 由於計算機的儲存位元組有限,所以不能完整表示乙個很大整數的精確值,這時候就得用到其他的方法,稱之為高精度演算法。這裡的高精度乘法主要指按位模擬乘法,實際上就是模擬乘法的過程,也就是筆算的過程。高精度乘低精度,即乙個大數與乙個小於10000的數相乘,大數使用字串來進行儲存,較...

大數相除「高精度除低精度」和「高精度除高精度」

二 高精度除高精度 採用計算機做高精度除法時,模擬日常除法的步驟。但計算機不可能做 試商 這時,我們可以採用減法來模擬 試商 的過程。演算法的步驟如下 1 將除數移動和被除數對齊,位數不夠時,補0。2 利用被除數減去除數,一直減到被除數小於除數,減的次數,就是 試商 的結果,每移動一次。3 重複上述...