Problem
給定一種洗牌方式,請問重複多少次之後會復原到原本一開始的排列。
Sample Input
|
|
Sample Output
|
|
Solution
一道置換群的題目,將置換的方式找出,接著找一組一組循環置換集合,找到最小公倍數即可。
|
|
給定一種洗牌方式,請問重複多少次之後會復原到原本一開始的排列。
|
|
|
|
一道置換群的題目,將置換的方式找出,接著找一組一組循環置換集合,找到最小公倍數即可。
|
|
找一條最短路徑從左上到右下,並且中間經過的字母不會有同時大小寫出現,也就是說 A
和 a
不能同時出現、B
和 b
不能同時出現 …
|
|
|
|
窮舉可使用的字符,對於每一種限定方式進行 bfs 搜索。
|
|
在賽車運動中,常用 Lap 表示套一圈賽道所消耗的時間,現在有多名賽車手,給予最快一圈多久、最慢一圈多久,請問在最快車手第幾圈的時候,可以倒追最慢的車手。
|
|
|
|
懶得推導公式,二分倒追的時間,找到何時會產生倒追,再計算第幾圈即可。
|
|
給一個 SOAP 的回應格式,解析給定的回應,並且提供屬性查找。
|
|
|
|
SOAP 類似 HTML XML 那種,在不少網路上的諮詢服務都會有這一套規則。
不過看到這一道題目很簡單,保證輸入格式一定可以相互匹配且完整,那使用遞迴 parsing 輸入,建造一個 tree 出來,同時子樹不會出現相同的命名。
建造樹出來之後,詢問就沿著樹走訪即可。
|
|
請問在 base 下,指定 score 的數字有多少個。
|
|
|
|
首先,可以知道每一次增加的總數最多為 (base - 1) (base - 1),因此我們的狀態紀錄之少要追溯到當前分數 n - (base - 1) (base - 1)。
然而由於 score 過大,不可直接著手 dp[score][tail_digit]
之類的 dp 計算。仍可以計算於 (base - 1) * (base - 1) 以下的情況。
接著,利用遞迴公式 (線性變換矩陣 ?),每一項為 a[score][tail_digit]
,而分數必須保留到當前 score - (base - 1) * (base - 1)
,因此狀態將會有 (base - 1) * (base - 1) * base
,也就是矩陣最大上限 5 * 5 * 6 = 150
。
矩陣的部分,可以假想每一次在尾數多增加一個 digit 上去,而在初始項部分仍必須依靠 dp 去計算。矩陣快速乘法直接套用 D&C 在 O(n^3 log k)
完成,並且計算時,盡可能將無用的 0 忽略計算,否則很容易 TLE。
|
|
給一張圖 (有向圖),請問從起始點走到特定點的路徑,花費 / 經過邊數
最小值為何?
並且最多經過 1000 條邊 (含),邊可以重複走。
|
|
|
|
如果沒有限制最多經過的邊,將會相當難辦事,因為一直繞就可以將平均值拉下,而會繞多久可能要玩一下環狀收斂,最小平均環,然後檢查是否會經過這個環抵達目的地 …
當然這一題已經給定最大使用邊數,定義狀態為 dp[i][j]
使用 j 條邊抵達目的地 i 的最小花費。按照 spfa 的精神不斷更新即可。
|
|
把每一種牌當作字串串在一起,請問第 k 小字典順序的排列為何?並且相同數字 (rank) 的牌不能放在一起。
|
|
|
|
題目最麻煩的地方是 k 必須使用 long long
才裝得下,然而中間運算過程中很容易超過 long long
因此在終止條件上會變得很難處理。
首先我們必須要知道那些牌可以排出哪幾種方法,但是很明顯地基礎的 dp 無法用上,少說狀態也必須是 13 * 2^50
之類的玩相鄰不可同色。
因此最後將牌壓縮成,擁有 4 張一樣、3 張、2 張、1 張的個數,擁有多少種排列方式。在寫遞迴的時候,標記上一次使用哪一類型的牌。為了逃出 overflow 的運算,使用一個 double 類別的輔助陣列,同樣計算方法數。
隨後知道固定類型的方法數,依序從字典順序小的開始窮舉是否要擺放於此位置。
|
|
找一個生成樹,使得最大邊與最小邊的差最小。
|
|
|
|
窮舉最小邊權重使用,使用 kruscal 找到瓶頸的最大邊。
|
|
包裹放置於架子上時,盡可能讓兩側的總量越重越好,而中間放置輕的物品。
找到一種放置方式,同時字典順序越小越好。
|
|
|
|
很明顯地可以使用貪心策略,每一次決定方最左或者是最右邊的項目。
由於要維持最小字典順序,放置兩個物品時
|
|
|
|
|
|
直接每一行每一行搜索,過程中預處理所有因數分解,並且同時剪枝不合法的列。
|
|