北師大珠海分校第十六屆IT節網絡預選賽題解

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;
    因此可以構建右矩陣爲:

    \begin{bmatrix}An-1 \\ n*(n-1)*(n-2) \\ (n-1)*(n-2) \\ n-1 \\ 1 \end{bmatrix}

    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;
    因此可以構建右矩陣爲:

    \begin{bmatrix}Bn-1\\ Bn-2 \\ (n-1)*(n-2) \\ n-1 \\ 1 \end{bmatrix}

    因爲有一樣的代表數據可以構建右矩陣:

    \begin{bmatrix}An-1 \\ Bn-1\\ Bn-2 \\ n*(n-1)*(n-2) \\ (n-1)*(n-2) \\ n-1 \\ 1 \end{bmatrix}

    根據上面給出的公式,構建左矩陣:

    \begin{bmatrix} 5 & 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 4 & -1 & 0 & 1 & 0 & 0\\ 0 & 1 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 3 & 6 & 0\\ 0 & 0 & 0 & 0 & 1 & 2 & 0\\ 0 & 0 & 0 & 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix}

    因此,矩陣相乘可以得到下一個An和Bn,相減就是答案。由線性代數的相關知識,左矩陣自己多次相乘再和右矩陣相乘不會影響結果,所以對左矩陣運用快速冪,優化時間。

G.噬元獸與千層糕

題意:
    有1000個千層糕,某些是草莓口味的,讓你去掉一些草莓口味的千層糕使得每一個區間長度爲m內的千層糕口味不超過k個,求最少去掉草莓口味的個數。
題解:
    貪心題,在[1, m]區間內我們優先刪除後面的草莓口味,同理[2, m+1]、...、[n-m+1, n]都是優先刪除後面的草莓口味。所以遍歷一遍記錄要刪除的個數即可輸出答案。

H.阿柴的千層糕

題意:
    求區間內不同數的和。
題解:
    莫隊算法模板題(線段樹+離線也闊以)。
    離線處理區間,通過mark標記出現的數並記錄次數來維護區間和。
    注意,要離散化數組的數,如果有其他辦法記錄也是OK的。

I.猜猜我是第幾名

題意:
    製作一個簡單模擬OJ排名的程序,輸出某個人的排名。
題解:
    可以構建一個結構體來存儲一個人的狀態,比如:姓名、過題數、罰時等。
    將結構體按照過題數優先罰時其次的規則排序,遍歷一次名字輸出名次即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章