2020.9.12將一本通上的貪心學的差不多了,現在就整理一下。
1.選擇不相交區間問題
例題:p1803 凌亂的yyy / 線段覆蓋
分析:板子題,沒什麼好說的,總之就是每次貪心選擇活動時間盡量少並且與之前的活動不相交的,不多評述。
2.區間選點問題
例題:p1250 種樹
分析:給定許多區間,叫你取盡量少的點達成每個區間都至少有一點的目標。解決方案就是每一次選擇區間末尾的那個點,使得這個點能同時存在於盡量多的區間內。
3.區間覆蓋問題
例題:#10002. 「一本通 1.1 例 3」噴水裝置
分析:給你幾個區間,讓你選幾個區間覆蓋乙個大的。解決方案就是先把區間按左端點大小進行排序,每次再貪心選擇右端點最大的,直到將區間覆蓋為止。
4.流水作業排程問題
例題:p1248 加工生產排程
分析:這種型別的題屬比較難的,但我做了這麼久的題也沒見過幾回,就這一道。有\(m_1\)和\(m_2\)兩台機器,要現在\(m_1\)上加工,再到\(m_2\)上加工。思路是要使用\(johnson\)演算法:讓\(m_1\)沒有空閒,讓\(m_2\)空閒時間盡量短。
可以證明得到乙個結論:設\(n_1\)為\(a的作業集合,\(n_2\)為\(a\ge b\)的作業集合,將\(n_1\)的作業按\(a\)非減序排序,\(n_2\)中的作業按\(b\)非增序排序,就可達成最優順序。
因為感覺實在不會來考,所以不準備證明,想看**實現和證明看書就行,不在這裡多扯。
5.帶限期和罰款的單位時間任務排程
例題:p1230 智力大衝浪
分析:將所有事件根據罰款大小排序,從罰款多的開始處理,再乙個個看能不能安排在所需的時間段內,不能就放棄處理。
6.習題
簡單的習題就不寫了,這裡只給出兩道比較難的。
p1717 釣魚
p2512 [haoi2008]糖果傳遞
思路就不想再講了,時間沒那麼多,有時間再自己去看題目。
實際上,考場上純考貪心的題實在不多,所以此處講的這些價值大不大?著實是個問題。但是要知道的是,考場上與貪心結合起來考的題非常多,所以貪心的思想一定要掌握好,要把握住貪心的精髓。
2020.10.12日時學習,剛好與貪心隔了乙個月(笑)
二分查詢就不說了,傻子都會。
二分答案怎麼說呢,入門題應當是這一道p1182 數列分段 section ii,其實當時理解還很淺薄,雖然將題解看了幾遍,但還是處於雲裡霧裡的狀態,懵懵懂懂的就過了,後面在看一本通時終於有一次豁然貫通,才理解了二分答案。
二分答案,顧名思義,我們可以根據題意確定答案的上下界,然後不斷二分,確定乙個答案,接著通過乙個判斷函式來判斷這個答案是否符合要求,接著就是縮小範圍,直到找到那個最優解。
適用題目型別:最大值最小或最小值最大,如果出現這兩種字眼,那不用懷疑,妥妥的是二分答案了。
板子題挺多的,就不一一枚舉,但再在整型二分之外還有另一種二分型別,更難的實數二分,對於這種型別的題目,精度一定要格外注意,稍不留神便會被精度坑死。
例題:p3743 kotori的裝置
想了想,還是放乙個板子
while(r-l>=1e-6)
嗯,精度要開大一點是比較保險的,不過建議也不要太大,1e-12就有點過分,一般1e-8是完全夠用的。
先放乙個模板傳送門:p3382 【模板】三分法
如果說二分是專門針對具有單調性的問題的話,那麼三分就一定是針對具有單峰性的問題。與三分有關的問題,其答案範圍構成的函式一般都具有乙個單峰或低谷,分別對應答案的最大值,最小值,模板如下。
while(r-l>=1e-6)
(剪枝)
for(列舉下一層可能的狀態)
}
搜尋,尤其是深搜,對於非常多題都適用,跟列舉的純暴力相差無幾,容易打,不易出錯,很多題用來對拍的暴力都是這種。它的時間複雜度是指數級別的,但是有時題目的正解,可能就是深搜這種暴力,正常跑是肯定跑不過去,但若是能優化,結果或許就會大不一樣。
說了一堆廢話,回到正題。這裡的主角是深搜,但是卻是有剪枝的深搜,剪掉深搜的搜尋樹上的那些無用枝條,使得深搜能在極短的時間內找出答案,這便是我們的正解。
但卻有三個加剪枝一定注意:正確性,準確性,高效性。做到這三點,那才能算真正優化到了。
優化技巧有很多,我現將書上的分類搬下來,以便**。
1.優化搜尋順序 2.排除等效冗餘 3.可行性剪枝 4.最優性剪枝 5.記憶化
先來看一道剪枝的入門題p1025 數的劃分
這裡使用搜尋可以說是很明顯了,要打出來也很簡單,但是分析一下複雜度就知道,tle是穩穩的。所以,這裡一定要加剪枝。如何剪枝呢?其實也很簡單,只要分析一下上下界即可,因為不考慮順序,所以可以設\(a[i-1]\le a[i]\),現在下界已經有了,也可以輕易推出上界是\(\frac\),只要加了這兩個簡單的剪枝,就可以愉快的ac了。
再來看一道剪枝的經典題目p1120 小木棍 [資料加強版]
這道題的剪枝異常之多,大類裡可以分出最優性剪枝與可行性剪枝兩類,根據題目具體細節就可以寫出很多剪枝,是一道很好的剪枝練習題。
經典題目還是放一下**
**
#include#include#includeusing namespace std;
int a[105],n,len,m,minn,sum,bj,tot,b[105],next[105];
bool ex[105];
bool cmp(const int &x,const int &y)
void read()
sort(a+1,a+tot+1,cmp);
next[tot]=tot;
for(int i=tot-1;i>0;i--) }
void dfs(int k,int last,int rest)
for(i=1;i<=tot;i++)
if(!ex[i])
dfs(k+1,i,len-a[i]);
ex[i]=0;
if(bj)return;
} int l=last+1,r=tot,mid;
while(l>1;
if(a[mid]<=rest)r=mid;
else l=mid+1;
} for(i=l;i<=tot;i++) }
}void solve()
;int g,st,prt[50005],b[1000000]=,step[50005];
char a[50005];
struct nodestart,goal,q[90000];
int turn(node x)
bfs();
return 0;
}
bfs的優化方法還有如雙端佇列,雙向bfs等,由於博主太弱,所以這裡不多說。
bfs習題
uva1714 keyboarding
p1225 黑白棋遊戲
基礎演算法學習筆記
解決演算法問題的思路 1 列舉 核心問題 1.避免無用的組合可以減少列舉的次數 2.找到列舉的規律 3.是否存在乙個區域性,一旦這個區域性確定,其他部分也確定了 2 遞迴 核心問題 1.後一項依賴前一項的結果,如等差 等比數列 2.從大到小考慮 3.本身問題的定義包含遞迴,如a的定義用到了自身a,並...
基礎 排序演算法學習筆記
noip範疇常見的排序一般是這幾種 1 氣泡排序,選擇排序,插入排序 2 快速排序,歸併排序,堆排序 3 計數排序,基數排序,桶排序 前兩類是基於比較的,第三類是基於統計的。第一類都是o n 2 的,第二類都是o nlogn 的。氣泡排序 1.相鄰的資料兩兩比較,小數放前面,大數放後面 2.這樣每一...
演算法學習筆記(一)演算法基礎
一 資料結構和演算法的關係 資料 data 結構 structure 是一門研究組織資料方式的學科,有了程式語言也就有了資料結構.學好資料結構編寫出更加漂亮,更加有效率的 要學習好資料結構就要多多考慮如何將生活中遇到的問題,用程式去實現解決 程式 資料結構 演算法 資料結構是演算法的基礎,換言之,想...