1、原因 不知不覺已經從事java開發好幾年了,成了人們口中的老司機。但是一直都是恍恍惚惚過來,對於框架底層實現一直都沒有怎麼瞭解過,只是在面試的時候背些面試題。慢慢地發現不能這樣,需要振作,笑~~~~。從這篇開始,記錄自己對於Spring載入過程的源碼查看。 ## 2、開始 1、在Spring載入 ...
A - mod M
這道題我們可以首先對於所有的數 $%2$ ,可以證明出答案最多不超過 $2$ ,此時我們就可以把問題轉化為:是否存在一個數使得序列 $a$ 中所有元素減去這個數之後的最大公因數大於$1$,就是一道妥妥的同餘了。
B - dp
這道題我們可不難想出$O(n^3)$的做法,即枚舉左端點和右端點,檢查這段區間的答案變換過後是否比當前答案更小,如果是,則更新當前答案。
然後就是優化了,我們可以發現,從開頭開始,我們遇到的第一個 $p$,是一定得被修改成 $d$ ,這樣肯定是最優選擇,那麼我們就可以省略了枚舉左端點的步驟,此時時間複雜度為$O(n^2)$,足以通過此題。
C - Lights Out on Tree
這道題我們首先有一些性質:
1.每個節點最多按一次
2.節點按下的先後順序沒有影響
依據這個性質,我們可以得到:當一個硬幣頭朝上時,要按下這個節點按鈕的最佳選擇是:
1.這個節點的父親是尾朝上
2.這個節點的子樹全是頭朝上
對於第一點,我們可以由性質1證明出來,如果這個節點的父親是頭朝上,那我們就再等到他父親再繼續。
然後對於第二點,依據性質2,我們可以假設如果一個節點在一開始表明頭朝上了,我們遍歷到他的父親時,這個節點里的所有子樹都已經頭朝上了(有點類似於 動態dp 的思路?),反之,這個節點里所有子樹都已經尾朝上,我們就需要按下這個節點的按鈕。