分數揹包(部分揹包):有乙個容量為 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 重複上述...