A.分不分
題意:
找一個 a + b = n, 且 a / b 最簡和最大。
題解:
大多數人都錯在了真分數上,不瞭解自行百度。
要取 a / b 最大,一定是從 n 的一半開始取,所以從 n / 2 開始左右遍歷判斷是否符合條件(即 a 和 b 互質爲最簡分數),符合直接輸出。
B.橘貓與千層糕
題意:
有n個千層糕,從每一個千層糕的[a, b]層中選取一層,把所有層數相加剛好可以被5取模,問這個選取有多少種情況。
題解:
當我們拿第一個千層糕的其中一層,那麼我們可以得到餘0、餘1、...、餘4的所有答案。當我們要拿第二個千層糕的其中一層,假設我們選取的層數模5餘1,那麼它和前面餘0相乘可以獲得餘1的答案,它和前面餘1相乘可以獲得餘2的答案,同理可以獲得所有餘0、餘1、...、餘4的答案。
因此我們可以設計一個dp公式:dp[i][j](其中i代表拿第i個千層糕,j代表拿了其中一層模5餘j的種類,一下mod0表示[a, b]中可以被5取模與0的個數,同理mod1、...、mod4)
dp[i][0] = dp[i][0] * mod0 + dp[i][1] * mod4 + dp[i][2] * mod3 + dp[i][3] * mod2 + dp[i][4] * mod1;
dp[i][1] = dp[i][1] * mod0 + dp[i][2] * mod4 + dp[i][3] * mod3 + dp[i][4] * mod2 + dp[i][0] * mod1;
...
dp[i][4] = dp[i][4] * mod0 + dp[i][0] * mod4 + dp[i][1] * mod3 + dp[i][2] * mod2 + dp[i][3] * mod1;
C.橘貓吃千層糕
題意:
求數組中的中位數,如果是偶數個,則取中間兩個的平均值。
題解:
直接排個序,奇數個取中間值,偶數個取中間兩個和的平均值。
題目中說數據在int範圍內,那麼偶數個取平均值時候相加肯定會爆int範圍,可以兩邊各取一般,其他方法也可以。
D.Erwin Schrödinger的橘貓
題意:
有n個密碼,有m個猜測密碼。如果猜測密碼的長度小於或等於密碼且是其中一個密碼的前綴,或者測密碼的長度大於密碼且其中一個密碼是猜測密碼的前綴,就可以輸出“YES”,否則輸出“NO”。
題解:
解法多種,只說一種。
構建一個結構體,裏面存儲[0,9]的結構體數組,鏈表形式進行建十叉樹,將密碼從頭遍歷存儲在結構體鏈表中。當我們去查詢猜測密碼是否符合條件時,可以從樹根搜索,到沒有分支或者猜測密碼結束時則符合條件,否則不符合。
E.星澈的臉盲症
題意:
有一個長度爲2*n-1的數組,找出其中只存在一次的元素。
題解:
數據範圍比較小,可以用一個長度爲1000的數組記錄[1,1000]中某些元素出現次數,之後遍歷一次數組,輸出只出現一次的數。異或,排序等方法都可以。
F.滅霸討厭千層糕
題意:
A1 = 1,A2 = 2,A3 = 5*A2 + 3*2*1,...,An = 5*An-1 + n*(n-1)*(n-2)。
B1 = 1,B2 = 3,B3 = 4*B2 - B1 + 2*1,...,Bn = 4*Bn-1 - Bn-2 + (n-1)*(n-2)。
輸出An - Bn。
題解:
An = 5*An-1 + n*(n-1)*(n-2);
An-1 = 5*An-2 + (n-1)*(n-2)*(n-3);
n*(n-1)*(n-2) = (n-1)*(n-2)*(n-3) + 3*(n-1)*(n-2);
n*(n-1) = (n-1)*(n-2) + 2*(n-1);
n = n-1 + 1;
因此可以構建右矩陣爲:
Bn = 4*Bn-1 - Bn-2 + (n-1)*(n-2);
Bn-1 = 4*Bn-2 - Bn-3 + (n-2)*(n-3);
n*(n-1) = (n-1)*(n-2) + 2*(n-1);
n = n-1 + 1;
因此可以構建右矩陣爲:
因爲有一樣的代表數據可以構建右矩陣:
根據上面給出的公式,構建左矩陣:
因此,矩陣相乘可以得到下一個An和Bn,相減就是答案。由線性代數的相關知識,左矩陣自己多次相乘再和右矩陣相乘不會影響結果,所以對左矩陣運用快速冪,優化時間。
G.噬元獸與千層糕
題意:
有1000個千層糕,某些是草莓口味的,讓你去掉一些草莓口味的千層糕使得每一個區間長度爲m內的千層糕口味不超過k個,求最少去掉草莓口味的個數。
題解:
貪心題,在[1, m]區間內我們優先刪除後面的草莓口味,同理[2, m+1]、...、[n-m+1, n]都是優先刪除後面的草莓口味。所以遍歷一遍記錄要刪除的個數即可輸出答案。
H.阿柴的千層糕
題意:
求區間內不同數的和。
題解:
莫隊算法模板題(線段樹+離線也闊以)。
離線處理區間,通過mark標記出現的數並記錄次數來維護區間和。
注意,要離散化數組的數,如果有其他辦法記錄也是OK的。
I.猜猜我是第幾名
題意:
製作一個簡單模擬OJ排名的程序,輸出某個人的排名。
題解:
可以構建一個結構體來存儲一個人的狀態,比如:姓名、過題數、罰時等。
將結構體按照過題數優先罰時其次的規則排序,遍歷一次名字輸出名次即可。