必刷貪心題

2022-05-16 11:23:04 字數 2723 閱讀 6874

01揹包裸題。因為物品不可分割因此不可貪心。

luogu p2374

看起來可以貪心,但是事實上由於體力係數在變化,因此每次選出每堆質量最大的書並不能得到最優解。於是考慮dp。設\(dp[i][j][k]\)表示當前考慮到每堆第\(i,j,k\)本書。當前狀態只能由\(dp[i-1][j][k],dp[i][j-1][k],dp[i][j][k-1]\)更新而來。因此方程就可以顯然地列出來了。

luogu p1223

貪心入門題。按照\(t\)從小到大排序統計就行。顯然把小的放在前面比把大的放在前面更優。

把吃的數量從小到大排序,每次讓最大和最小的組合就可以了。

luogu p1209

我們可以先假設只有一塊木板從編號最小的牛棚一直鋪到編號最大的牛棚,然後斷開\(m-1\)處。自然要按相鄰牛棚的編號差從大到小斷開才能使我們斷開的地方可以有效節省木板長度(因為中間省去的要更多)

luogu p1106

首先,考慮第一位。將第一位所有可能的位置列舉一下,取最小且最前的乙個。因為同樣長度的數字比較看開頭,於是這樣便保證了第一位的最優性。要注意,要取最前的乙個,盡量保留更多的可選數。而第二位就在第乙個數之後的所有允許範圍內列舉,方法同第一位。這樣,取完了所有要取的數,然後輸出就可以了。

poj 2393

顯然有乙個事實,記第\(i\)天單價為\(c_i\),第\(i-1\)天生產的成本為\(c_\),那麼當\(c_i > c_ + s\)時在第\(i-1\)天生產第\(i\)天的乳酪最優。

因為是按順序操作的,\(c_i\)一定會從最優的\(c_\)更新過來,因此無後效性。

luogu p1842

一開始想了乙個優秀的隨機化演算法,原理就是隨機生成乙個\(1\)~\(n\)的排列,然後查詢答案,但是由於資料範圍很大,很難在\(1s\)得到答案。

於是考慮貪心。按照\(w+s\)可得到最優排列。

luogu p1080

首先假設只有兩個大臣,模擬一下發現排列順序僅由\(a*b\)決定。

如果多來幾個人,那麼可以把\(1\)~\(n-1\)當成乙個大臣,然後仍然按照兩個大臣模擬。

所以貪心策略就出來了,按照\(a*b\)排序就行了。

統計答案的時候需要寫高精度乘法、除法。

luogu 1230

顯然貪心一下,扣錢最多的遊戲要先處理。可以在\([1,t_i]\)範圍內處理,貪心地想一定要盡可能往後放。所以先按照扣錢排序,列舉每個遊戲放在哪個時間處理,\(t_i\)到1倒序列舉放的位置,如果放不了則這個遊戲不選,直接計算扣的錢。

定義\(s[i]\)表示\([0,i]\)選了多少個數。如果有乙個區間\([l,r]\),則必然滿足\(s[r]-s[l-1] \geq 2\),而每個數顯然只能選一次,有\(s[i] - s[i - 1] \leq 1\),並且\(s[i] - s[i - 1] \geq 0\),那麼按照這幾個不等式連邊跑差分約束系統就可以了。

按照區間右端點排序,選擇左端點就行。

luogu p1325

以每個點為圓心,半徑為\(d\)畫圓,在海岸線上有\(l,r\)兩個交點,然後轉化為區間選點問題。

顯然沒有交點自然就無解了。

luogu p1843

每次二分乙個時間\(t\),假設有\(q\)件衣服在\(t\)天後仍然是溼的,這個\(q>k\)則答案不合法,否則答案合法。

其實就是把智力大衝浪反過來處理就行,並查集優化一下。

poj 2431

為了減少加油次數,顯然應該選取加油量最多的加油站。而為了保證是否能選,就需要先按照距離排序再處理。那麼就可以得到乙個按照當前油量可以到達的所有加油站的區間。在這些加油站中就需要選出加油量最多的。可以用乙個堆來實現取出最大值操作。總複雜度 \(o(nlog_n)\)

luogu p3045

顯然價值越低越應該買,所以我們用乙個堆維護**,記錄用過的優惠券數量。然後掃一遍就行了。複雜度\(o(nlog_n)\)

因為只有兩個人,所以暴力列舉**次數就可以了。剪枝:先保證與\(a\)**單位時間經驗更多。為了使列舉的**次數控制在\(\sqrt n\)以內,需要判斷一下:若\(a> \sqrt n\),則列舉次數一定小於\(\sqrt n\),正常列舉與\(a\)**次數即可。否則,列舉與\(b\)**次數。因為與\(a\)**更優,即與\(a\)**\(b\)次優於與\(b\)**\(a\)次,當列舉與\(b\)**次數大於等於\(a\)時,一定不如把其中的\(a\)次變成和\(a\)**。所以最多只要列舉\(a\)次。

sdut 1310

顯然直接貪心一定\(gg\)

考慮一下假設我們選了\(a_i,a_j\)兩個數,並且規定\(b_i < b_j\),那麼應該先選\(a_j\),因為假設分別在第\(x,y\)回合選了\(a_i,a_j\),若先選\(a_i\),對答案的貢獻是\(a_i - x \times b_i + a_j - y \times b_j\) ,反過來則是\(a_i - y \times b_i + a_j - x \times b_j\),作差得\((y-x)(b_i-b_j)\),可見先選\(a_j\)對答案貢獻更大。那麼只要按照\(b\)從大到小排序,進行\(dp\)轉移就行。

定義\(dp[i][j]\)表示前\(i\)個數里選出\(j\)個的最大得分,有\(dp[i][j]=max(dp[i-1][j],dp[i-1][j-1] + a[i] - b[i] * (j - 1)\)

\(dp[n][m]\)即為答案。

luogu p2060

顯然直接暴搜資料範圍受不了,於是我們考慮貪心一下,每次移動應該盡可能使得到終點切比雪夫距離更小。但是小範圍內正確性無法保證,於是打個表處理一下就行了。

網路流必刷題

未完待續 serve as網路流做題記錄集 總結 可能思路 轉化為乙個代價決策問題 即,考慮先把所有房子都建到h,然後再來決策是交罰金還是拆樓 有可能這類決策問題多採用 的方法 本題解法 那麼首先是基於乙個貪心思想 如果我們要交罰款,那肯定要建滿房子。於是就可以 對於每個房子,建立1 h這些點,表示...

貪心演算法刷題

牛牛有乙個陣列array,牛牛可以每次選擇乙個連續的區間,讓區間的數都加1,他想知道把這個陣列變為嚴格單調遞增,最少需要操作多少次?嚴格遞增,我們應該讓某個數字後面的乙個比他小的連續區間都進行加1操作,然後遍歷整個陣列 除最後乙個數字 其實我們不需要真正的對陣列進行加1操作,只需要求出ai與ai 1...

刷題 貪心 觀光公交

題解還是考後再寫吧,先鴿了 include include include using namespace std intn,m,k const int n 100003 int dis n out n peo n bus n dis i 表示到下一站的時間,中間會修改,peo表示每個站人到的最後時...