2020.11.16
今天學的東西比較多,由於是按照紫書上的順序來學的,就稍微整理一下。
棧和佇列
關於佇列的例題裡就一道,關於雙向佇列,而且題意實在是看不懂,被迫放棄了。(普通佇列和優先佇列我應該還熟吧)
關於棧的題做了兩道,感覺運用能力提高了一些。棧這東西貌似在對付括號這方面有奇效,有時間要去做一下括號樹了。棧的定義很簡單,就是乙個lifo表,即last in first out,後進先出的意思。主要得學會應用。
一道例題:uva442 矩陣鏈乘
鍊錶
感覺上學的並不是很懂,不過有點似懂非懂的意味?其實大概也就是用乙個特殊的陣列把所有陣列內的東西串聯起來,可以更方便移動陣列內的元素。不過說實話,鏈式前向星應當也是一種鍊錶,感覺就是這樣。
具體的東西還是要看**實現。嘴上說說作用似乎不大,所以就放一道雙向鍊錶的經典例題在這吧:uva12657 移動盒子。
至於應用,其實我也說了,一般只有要求要大量移動陣列內的元素的題才用得上鍊表,至少我做的兩道例題都是如此,也許明天做的習題會有新花樣?
樹與二叉樹
1.二叉樹的編號
嗯,總之記住乙個基本的東西,就是左子樹編號=根的編號×2,右子樹編號=根的編號×2+1。單考編號的話應該考不到很難,只需熟練地掌握基本性質即可。當然,一定的分析能力必不可少,這就需要花時間去提公升了。
2.二叉樹的層次遍歷
一堆指標,直接被勸退,等我哪一天學好了指標再說吧……
3.二叉樹的遞迴遍歷
二叉樹的3種遍歷方式:先序遍歷,中序遍歷以及後序遍歷。之前看白書的時候怎麼看都看不懂,現在用遞迴版的定義就清晰明了的多了。
preorder(t)=t的根節點+preorder(t的左子樹)+preorder(t的右子樹)
inorder(t)=inorder(t的左子樹)+t的根節點+inorder(t的右子樹)
postorder(t)=postorder(t的左子樹)+postorder(t的右子樹)+t的根節點
本小節有三道例題,都是對遞迴非常好的應用,應當掌握。
4.非二叉樹
平時會碰到的題大部分都是二叉樹的,非二叉樹實在太少,就隨意講了。非二叉樹的題給你的樹一般也不是隨便的,可能也就是三叉樹,四叉樹那樣的,能熟練掌握遞迴建樹就行了,大概就這乙個要點。
圖
1.用dfs求聯通塊
感覺跟求強連通分量差不多,只要對於每乙個特殊地形,都用一次深度優先遍歷將整張圖都跑一遍,同時注意去重就行了。
2.用bfs求最短路
這個最簡單的用法就不說了,我早就會了。還是看看更難的例題吧:uva816 abbott的復仇。
實際題目中要求會更多,比如朝向之類的狀態可能會出現,但其實也不用太擔心,對於每一種狀態都分別處理好就行了,只是有時可能真的會麻煩一點。
3.拓撲排序
例題太水了不說。當時學縮點的時候就順便學了,筆記在圖論那一塊有,翻翻就是了。
4.尤拉迴路
看了看,感覺好像也沒什麼,沒有想象中難。
有尤拉迴路或尤拉道路的乙個先決條件是圖聯通,這個dfs一遍即可判斷。其次要記錄每個點的入度與出度。
由於尤拉迴路與尤拉道路的特殊性,它要求最多只能有兩個奇點,即度數為奇數的點。這兩個奇點分別是尤拉道路的起點與終點。
起點的出度比入度大1,終點的入度比出度大1。如果沒有奇點,就可以從任何點出發,最終都可以回到該點,即為尤拉迴路。
2020.11.17
今天沒有學新的知識,只是在做昨天學的東西的習題。感覺思維還有待提公升,不看題解大概也就做一些比較裸的題,資料結構還是比較難的。尤其是書上的習題,感覺都很難。
主要是uva全是字串,實在過於難受,輸入輸出都搞得很麻煩,而且uva天天多組資料還不告訴你資料組數,屬實可惡,至於卡格式更是uva特色。
做了幾道簡單一點的習題,收穫比較大的大概是求先後序排列?不過這東西可能也就初賽會考考,複賽應該不會考這麼冷門的東西,紫書有些東西實在是過時了。
找了以前的弱省省選題做了一些,做的都是很簡單的,一遍過,發現以前的省選裡簡單題還確實是簡單的。雖然真的是很久以前的省選題了
明天開始學新知識了,希望書上的暴力求解法對比賽真的有用吧。
最後感嘆,生活在乙個沒有字串的國度實在是太好了。該死的uva就不能多用用阿拉伯數字嗎
2020.11.18
開始學習暴力求解專題,學了很多新東西,其實並沒有。跟著書上做了幾道簡單列舉題,發現有時候無腦列舉也不可行,稍微思考一下可以大大減少列舉量。
學會了列舉全排列,生成子集,感覺以後可能會用到,位運算的方法比較新穎獨特,**放在這裡。
void print_subset(int n,int s)
return 0;
}int main()
}
tle後改成這樣了。
for(int i=last+1;i<=n;i++)
結果a了。
我左思右想也沒想通,我不就讓程式多判斷了幾次,而且 \(n\le20\) ,這能多出多少列舉量來?
事實證明我錯的離譜,這麼小的資料範圍也能增這麼多列舉量,看來以後要改變習慣。
不要忽視任何乙個優化,因為你不知道它將給你減少多少萬次迴圈。--沃茲基·朔德。
今日總結:思維依舊嚴重不足,感覺一天天的大腦都快要生鏽了,大概也就是能水一水普及-的題?沒學過可能還不一定能過得了
2020.11.20
今天划水現象嚴重,在此嚴厲批評。
上午使用a*演算法做了兩道k短路,模板是黑的,所以今天a了第一道黑題(可喜可賀)。近11點寫完兩道題就去逛水區了,結果剩餘時間隻水了3道cf簡單題完成任務,應當反省。
用a*解k短路問題思路如下。
首先要知道k短路如何求,我們知道一般的優先佇列dij求最短路,第一次遇到終點時就是最短路,那麼其實當我們第k次將終點入隊時,得到的就是到終點的第k短路徑。
但是我們直接去求是一定會超時的,這時候就要用到a*演算法的估價函式來減少迴圈次數,優先順序的判斷需要轉換,我們需要先求出終點到其他所有點的最短路徑,用陣列f儲存,然後優先順序處理時用當前距離dis加上預估距離f來判斷。
因為f已經是從此點到終點的最短路徑,所以估價函式設計正確,實際長度不會比估計長度更小。
注意:估價函式剪枝效果非常不穩定,雖然大多數時候不會tle,但是會因為佇列內儲存狀態過多而mle。簡而言之,a*演算法和spfa一樣都會被卡,但是卡的力度並不很大,在洛谷的題中都只有乙個點來卡,一般可以獲得90分,必須打表才可過。
**就不放了,可以到模板題去看。
下午做題沒有方向,划水劃了乙個小時,不想寫ida*,又不知道學什麼好。於是就稍微看了看藍書和黑書中關於約數的數學知識,並做了幾道題。
稍微整理一些基礎數學知識。
算術基本定理:
任意乙個大於 \(1\) 的正整數都能唯一分解為有限個質數的乘積,可寫作:
\[n=p_1^p_2^\dots p_m^
\]其中 \(c_i\) 都是正整數, \(p_i\) 都是質數,且滿足 $p_1試除法分解質因數**實現
void divide
} if(n>1)p[++m]=n,c[m]=1;
for(int i=1;i<=m;i++)
cout《由算術基本定理可推得,n的正約數集合為:
\[p_2^\dots p_m^},\text0\le b_i\le c_i
\]n的正約數個數為
\[(c_1+1)*(c_2+1)*\ldots *(c_m+1)=\prod\limits_^m(c_i+1)
\]n的所有正約數的和為
\[(1+p_1+p_1^2+\ldots +p_1^*\ldots *(1+p_m+p_m^2+\ldots +p_m^)=\prod\limits_^m(\sum\limits_^(p_i)^j)
\]求正約數個數的公式用的比較多。
例題:反素數
晚上還劃了很久的水,需要好好反省。就沒做什麼題了,做了道位運算。
反省結果就是沒有明確目標,於是剩餘時間就一直在搞之後的學習計畫與任務清單,好在終於搞完了。
總之,紫書的部分已經完結了,馬上要告別uva好耶,投入到更多的題目中去了。
完結,明天會開新的一章。
筆記82 Launcher常用修改(重修版)
10.1全介面 11.預設桌布 public void initwall catch ioexception e sp.edit putboolean initwall true commit 12.0 系統預設的外掛程式 12.1 mhandler中接收收音資料 private final han...
重修dp 揹包
就算分組揹包模板,用vector把每個種類相同的存一起就行了 對於每乙個course,只能選擇乙個使用日期。那麼就把course進行分組,運用分組揹包求最大值即可 把共線的設定為一組,然後按照gold的距離把權值加入,比如為想獲取第乙個金礦的權值就算第乙個金礦,假如為算第二個金礦的話權值就要算上第一...
Linux重修第二課(初識SHELL)
mv info 擴充套件為mv info info.old cmd 後台執行 cmd 在自shell中執行 cmd1 cmd2 注意是反引號,將cmd2的結果作為1的引數 cmd cmd2 1成功後才執行2,還可以替換成 表示1執行失敗才執行2 幾種shell的配置檔案路徑 sh bash prof...