60分鍾兩道題,第一道樹相關占30分,第二道簡單數論占20分。時間分配嚴重不合理,第二題不到十分鍾就解決了,剩下的時間都在處理第一題的compile error……咕鴿online沒有錯誤提示,感覺和面試時候白板手寫代碼差不多了TvT再次讓我感到ide的偉大……
challenge幫你處理題目輸入輸出,和在leetcode做有點相似,你只要關心主邏輯就可以了。和leetcode不一樣的地方是,會把輸入輸出的過程給你看,畢竟你得知道輸入長什么樣,特別是圖,會有很多種表示方法。第一題我就在這里踩了坑,沒注意到邊的表示不是鄰接矩陣,而是拿了個vector存兩個頂點,還不告訴我誰是父結點誰是子結點(如果題目其實給的數據是按照父結點子結點的順序的話,請忽略之,腦子確實有點懵),於是sigsev了……
第一題:給一棵樹,要求找到距離最近且數值互質的祖先結點。
時間空間:(不記得了……)
測試組數T:(不記得了……)
結點個數N:1<=N<=105
每個結點的值Valuei:1<=Valuei<=100
太慘了,五個樣例都只過了一個……直接輸入輸出是不是都能拿分啊我沒試過,之前也沒找到這個比賽的題目信息啊(已善用搜索)
結束了還懵圈了一個小時,然后我大概意識到自己的錯誤,seq小的不一定是seq大的結點的祖先結點啊!感覺算法這邊得針對圖相關的題目查漏補缺一下了。
第二題:給三個數,類型是long long,定義一次操作是將其中兩個數同時減一,但不能將任何一個數減至負數。問最大操作數是多少。
例子是2 3 4,可行的操作是
第一種:2 3 4 → 1 2 4 → 0 1 4 → 0 0 3 三次操作
第二種:2 3 4 → 2 2 3 → 2 1 2 → 1 1 1 → 0 0 1 四次操作
顯然就是四次操作是最大操作數了……
看到標題里有“最大”,我還以為會用dp……
思路很明確,直接上代碼吧
long long maxOpNum(long a, long b, long c) { long long x, y, z; x = max(max(a, b), c); y = min(min(a, b), c); z = a + b + c - x - y; if (x >= y + z) { return y + z; } return (x + y + z) >> 1; }
總體來說應該是不難的,但是因為各種原因,不熟練、有知識漏洞、讀題做題習慣,時間不夠用。練習時間還是太少了……
Anyway,加油鴨ヾ(◍°∇°◍)ノ゙