1. 程式人生 > >CCF201612試題

CCF201612試題

試題編號: 201612-1
試題名稱: 中間數
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述: 問題描述   在一個整數序列a1, a2, …, an中,如果存在某個數,大於它的整數數量等於小於它的整數數量,則稱其為中間數。在一個序列中,可能存在多個下標不相同的中間數,這些中間數的值是相同的。
  給定一個整數序列,請找出這個整數序列的中間數的值。 輸入格式   輸入的第一行包含了一個整數n,表示整數序列中數的個數。
  第二行包含n個正整數,依次表示a1, a2, …, an。 輸出格式   如果約定序列的中間數存在,則輸出中間數的值,否則輸出-1表示不存在中間數。 樣例輸入 6
2 6 5 6 3 5 樣例輸出 5 樣例說明   比5小的數有2個,比5大的數也有2個。 樣例輸入 4
3 4 6 7 樣例輸出 -1 樣例說明   在序列中的4個數都不滿足中間數的定義。 樣例輸入 5
3 4 6 6 7 樣例輸出 -1 樣例說明   在序列中的5個數都不滿足中間數的定義。 評測用例規模與約定   對於所有評測用例,1 ≤ n ≤ 1000,1 ≤ ai
 ≤ 1000。

試題編號: 201612-2
試題名稱: 工資計算
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述: 問題描述   小明的公司每個月給小明發工資,而小明拿到的工資為交完個人所得稅之後的工資。假設他一個月的稅前工資(扣除五險一金後、未扣稅前的工資)為S元,則他應交的個人所得稅按如下公式計算:
  1) 個人所得稅起徵點為3500元,若S不超過3500,則不交稅,3500元以上的部分才計算個人所得稅,令A=S-3500元;
  2) A中不超過1500元的部分,稅率3%;
  3) A中超過1500元未超過4500元的部分,稅率10%;
  4) A中超過4500元未超過9000元的部分,稅率20%;
  5) A中超過9000元未超過35000元的部分,稅率25%;
  6) A中超過35000元未超過55000元的部分,稅率30%;
  7) A中超過55000元未超過80000元的部分,稅率35%;
  8) A中超過80000元的部分,稅率45%;
  例如,如果小明的稅前工資為10000元,則A=10000-3500=6500元,其中不超過1500元部分應繳稅1500×3%=45元,超過1500元不超過4500元部分應繳稅(4500-1500)×10%=300元,超過4500元部分應繳稅(6500-4500)×20%=400元。總共繳稅745元,稅後所得為9255元。
  已知小明這個月稅後所得為T元,請問他的稅前工資S是多少元。 輸入格式   輸入的第一行包含一個整數T,表示小明的稅後所得。所有評測資料保證小明的稅前工資為一個整百的數。 輸出格式   輸出一個整數S,表示小明的稅前工資。 樣例輸入 9255 樣例輸出 10000 評測用例規模與約定   對於所有評測用例,1 ≤ T ≤ 100000。

試題編號: 201612-3
試題名稱: 許可權查詢
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述: 問題描述   授權 (authorization) 是各類業務系統不可缺少的組成部分,系統使用者通過授權機制獲得系統中各個模組的操作許可權。
  本題中的授權機制是這樣設計的:每位使用者具有若干角色,每種角色具有若干許可權。例如,使用者 david 具有 manager 角色,manager 角色有 crm:2 許可權,則使用者 david 具有 crm:2 許可權,也就是 crm 類許可權的第 2 等級的許可權。
  具體地,使用者名稱和角色名稱都是由小寫字母組成的字串,長度不超過 32。許可權分為分等級許可權和不分等級許可權兩大類。分等級許可權由許可權類名和許可權等級構成,中間用冒號“:”分隔。其中許可權類名也是由小寫字母組成的字串,長度不超過 32。許可權等級是一位數字,從 0 到 9,數字越大表示許可權等級越高。系統規定如果使用者具有某類某一等級的許可權,那麼他也將自動具有該類更低等級的許可權。例如在上面的例子中,除 crm:2 外,使用者 david 也具有 crm:1 和 crm:0 許可權。不分等級許可權在描述許可權時只有許可權類名,沒有許可權等級(也沒有用於分隔的冒號)。
  給出系統中使用者、角色和許可權的描述資訊,你的程式需要回答多個關於使用者和許可權的查詢。查詢可分為以下幾類:
  * 不分等級許可權的查詢:如果許可權本身是不分等級的,則查詢時不指定等級,返回是否具有該許可權;
  * 分等級許可權的帶等級查詢:如果許可權本身分等級,查詢也帶等級,則返回是否具有該類的該等級許可權;
  * 分等級許可權的不帶等級查詢:如果許可權本身分等級,查詢不帶等級,則返回具有該類許可權的等級;如果不具有該類的任何等級許可權,則返回“否”。 輸入格式   輸入第一行是一個正整數 p,表示不同的許可權類別的數量。緊接著的 p 行被稱為 P 段,每行一個字串,描述各個許可權。對於分等級許可權,格式為 <category>:<level>,其中 <category> 是許可權類名,<level> 是該類許可權的最高等級。對於不分等級許可權,字串只包含許可權類名。
  接下來一行是一個正整數 r,表示不同的角色數量。緊接著的 r 行被稱為 R 段,每行描述一種角色,格式為
  <role> <s> <privilege 1> <privilege 2> ... <privilege s>
  其中 <role> 是角色名稱,<s> 表示該角色具有多少種許可權。後面 <s> 個字串描述該角色具有的許可權,格式同 P 段。
  接下來一行是一個正整數 u,表示使用者數量。緊接著的 u 行被稱為 U 段,每行描述一個使用者,格式為
  <user> <t> <role 1> <role 2> ... <role t>
  其中 <user> 是使用者名稱,<t> 表示該使用者具有多少種角色。後面 <t> 個字串描述該使用者具有的角色。
  接下來一行是一個正整數 q,表示許可權查詢的數量。緊接著的 q 行被稱為 Q 段,每行描述一個授權查詢,格式為 <user> <privilege>,表示查詢使用者 <user> 是否具有 <privilege> 許可權。如果查詢的許可權是分等級許可權,則查詢中的 <privilege> 可指定等級,表示查詢該使用者是否具有該等級的許可權;也可以不指定等級,表示查詢該使用者具有該許可權的等級。對於不分等級許可權,只能查詢該使用者是否具有該許可權,查詢中不能指定等級。 輸出格式   輸出共 q 行,每行為 false、true,或者一個數字。false 表示相應的使用者不具有相應的許可權,true 表示相應的使用者具有相應的許可權。對於分等級許可權的不帶等級查詢,如果具有許可權,則結果是一個數字,表示該使用者具有該許可權的(最高)等級。如果使用者不存在,或者查詢的許可權沒有定義,則應該返回 false。 樣例輸入 3
crm:2
git:3
game
4
hr 1 crm:2
it 3 crm:1 git:1 game
dev 2 git:3 game
qa 1 git:2
3
alice 1 hr
bob 2 it qa
charlie 1 dev
9
alice game
alice crm:2
alice git:0
bob git
bob poweroff
charlie game
charlie crm
charlie git:3
malice game 樣例輸出 false
true
false
2
false
true
false
true
false 樣例說明   樣例輸入描述的場景中,各個使用者實際的許可權如下:
  * 使用者 alice 具有 crm:2 許可權
  * 使用者 bob 具有 crm:1、git:2 和 game 許可權
  * 使用者 charlie 具有 git:3 和 game 許可權
  * 使用者 malice 未描述,因此不具有任何許可權 評測用例規模與約定   評測用例規模:
  * 1 ≤ p, r, u ≤ 100
  * 1 ≤ q ≤ 10 000
  * 每個使用者具有的角色數不超過 10,每種角色具有的許可權種類不超過 10
  約定:
  * 輸入保證合法性,包括:
  1) 角色對應的許可權列表(R 段)中的許可權都是之前(P 段)出現過的,許可權可以重複出現,如果帶等級的許可權重複出現,以等級最高的為準
  2) 使用者對應的角色列表(U 段)中的角色都是之前(R 段)出現過的,如果多個角色都具有某一分等級許可權,以等級最高的為準
  3) 查詢(Q 段)中的使用者名稱和許可權類名不保證在之前(U 段和 P 段)出現過
  * 前 20% 的評測用例只有一種角色
  * 前 50% 的評測用例許可權都是不分等級的,查詢也都不帶等級

試題編號:    201612-4
試題名稱:    壓縮編碼
時間限制:    3.0s
記憶體限制:    256.0MB
問題描述:    
問題描述
  給定一段文字,已知單詞a1, a2, …, an出現的頻率分別t1, t2, …, tn。可以用01串給這些單詞編碼,即將每個單詞與一個01串對應,使得任何一個單詞的編碼(對應的01串)不是另一個單詞編碼的字首,這種編碼稱為字首碼。
  使用字首碼編碼一段文字是指將這段文字中的每個單詞依次對應到其編碼。一段文字經過字首編碼後的長度為:
  L=a1的編碼長度×t1+a2的編碼長度×t2+…+ an的編碼長度×tn。
  定義一個字首編碼為字典序編碼,指對於1 ≤ i < n,ai的編碼(對應的01串)的字典序在ai+1編碼之前,即a1, a2, …, an的編碼是按字典序升序排列的。
  例如,文字E A E C D E B C C E C B D B E中, 5個單詞A、B、C、D、E出現的頻率分別為1, 3, 4, 2, 5,則一種可行的編碼方案是A:000, B:001, C:01, D:10, E:11,對應的編碼後的01串為1100011011011001010111010011000111,對應的長度L為3×1+3×3+2×4+2×2+2×5=34。
  在這個例子中,如果使用哈夫曼(Huffman)編碼,對應的編碼方案是A:000, B:01, C:10, D:001, E:11,雖然最終文字編碼後的總長度只有33,但是這個編碼不滿足字典序編碼的性質,比如C的編碼的字典序不在D的編碼之前。
  在這個例子中,有些人可能會想的另一個字典序編碼是A:000, B:001, C:010, D:011, E:1,編碼後的文字長度為35。
  請找出一個字典序編碼,使得文字經過編碼後的長度L最小。在輸出時,你只需要輸出最小的長度L,而不需要輸出具體的方案。在上面的例子中,最小的長度L為34。
輸入格式
  輸入的第一行包含一個整數n,表示單詞的數量。
  第二行包含n個整數,用空格分隔,分別表示a1, a2, …, an出現的頻率,即t1, t2, …, tn。請注意a1, a2, …, an具體是什麼單詞並不影響本題的解,所以沒有輸入a1, a2, …, an。
輸出格式
  輸出一個整數,表示文字經過編碼後的長度L的最小值。
樣例輸入
5
1 3 4 2 5
樣例輸出
34
樣例說明
  這個樣例就是問題描述中的例子。如果你得到了35,說明你算得有問題,請自行檢查自己的演算法而不要懷疑是樣例輸出寫錯了。
評測用例規模與約定
  對於30%的評測用例,1 ≤ n ≤ 10,1 ≤ ti ≤ 20;
  對於60%的評測用例,1 ≤ n ≤ 100,1 ≤ ti ≤ 100;
  對於100%的評測用例,1 ≤ n ≤ 1000,1 ≤ ti ≤ 10000。

試題編號:    201612-5
試題名稱:    卡牌遊戲
時間限制:    3.0s
記憶體限制:    256.0MB
問題描述:    
問題描述
  小Q和小M是遊戲數值策劃師,他們最近在測試自己新設計的卡牌對戰遊戲。遊戲總共有 n 張卡牌,用 1 到 n 的正整數編號。最開始小Q和小M各會擁有其中的一部分。
  每一局遊戲,小Q和小M都需要從自己擁有的卡牌中選出一張進行對戰,獲勝的一方會獲得雙方選出的兩張卡牌。遊戲會一直進行下去,直到其中一個人獲得了所有的卡牌,此時獲得所有卡牌的一方贏得了最終的勝利。
  對於一對特定的卡牌 i 和 j,i 戰勝 j 的概率為 Pi, j。此概率與其他事件獨立,只與選出的這兩張卡牌有關係;每次對戰一定會決出勝負,因此有 Pi,j + Pj,i = 1。
  小Q和小M都沒有好好學習博弈論,已經忘了混合決策那套理論。經過商量,他們採取了同一套看起來合理的選牌方式:
  1. 對於自己的卡牌 i,計算出這張卡牌能贏得對方每張卡牌的概率之和 Si=∑j是對方的卡牌Pi, j
  2. 令自己選出卡牌i的概率正比於Si,即選出i的概率為 Si/∑k是自己的卡牌Sk
  小M想知道,對於給出的 m 種初始狀態,他最終獲勝的概率是多少。
輸入格式
  從標準輸入讀入資料。
  輸入的第一行包含兩個正整數 n, m 表示卡牌的數量和初始狀態的數量。
  接下來 n-1 行。其中的第 i 行(1 ≤ i < n)包含 n - i 個恰好含有 2 位小數的浮點數;該行的第 j 個(1 ≤ j ≤ n - i)數表示 Pi, i+j
  保證上述每個 Pi,j 均是直接呼叫偽隨機數生成函式生成一個 [10, 90] 上的整數,然後除以 100 得到;即可以認為每個數都是從 [0.10, 0.90] 上的所有 2 位小數中,獨立等概率取得的。
  接下來 m 行,每行包含 n 個 0 或 1 的整數,描述一個初始狀態。這 n 個數中的第 i 個如果是 1 表示第 i 張牌最初在小M手中,否則表示這張牌在小Q手中。
  保證詢問兩兩不同。
輸出格式
  輸出到標準輸出。
  輸出 m 行,每行輸出一個小數部分長度恰好為5的浮點數,表示小M的每種初始狀況最終獲勝的概率四捨五入後的結果。
  你答案中的每個數必須和參考答案完全一樣才能獲得相應測試點的分數。
  保證參考答案與真實答案的差值不超過 4 × 10-6。
樣例輸入
3 4
0.46 0.21
0.86
0 0 0
1 1 0
0 0 1
1 1 1
樣例輸出
0.00000
0.83488
0.16512
1.00000
樣例說明

局面編號 小M的牌 小Q的牌 S1 S2 S3 小M的
Si 之和
小Q的
Si 之和
x1 1 2,3 0.67 0.54 0.79 0.67 1.33
x2 2 1,3 0.46 1.40 0.14 1.40 0.60
x3 3 1,2 0.21 0.86 0.93 0.93 1.07

  我們設 P (x) 為當前局面為 x,最終小M獲勝的概率,例如 P (x1) 表示小M手裡的牌為 1 最終獲勝的概率。
  定義事件 ^x 為將局面 x 中雙方手裡的牌互換的局面,根據對稱性易得 P( ^x)=1 - P (x)。
  對於全部牌都在小M手裡的情況,小M已經贏得了勝利,此種情況下小M獲勝概率為 1;相反,牌全部在小Q手裡的話,小M獲勝概率為 0。
  對於局面 x1:小M由於只有一張牌 1,因此他必須出這張牌;小Q根據之前的選牌策略,他有 0.54/1.33 的概率出 2,有 0.79/1.33 的概率出 3。若小Q出 2:則小M有 0.46 的概率會贏得這張牌,從而進入局面 ^x3;有 1-0.46 的概率會輸掉手中最後一張 1。若小Q出 3:則小M有 0.21 的概率會贏得這張牌,從而進入局面 ^x2;有 1-0.21 的概率會輸掉最後一張 1。因此,可以得出



  同理,可以求出 P (x2) 和 P (x3) 的表示式:



  注意到 0.2484/1.33, 0.1204/0.60 等數均小於 1,我們可以將三個式子互相不斷代入各自的等式右邊,得到一個收斂的級數。對這個級數求和就能求出樣例的答案。
樣例輸入
2 4
0.34
0 0
1 0
0 1
1 1
樣例輸出
0.00000
0.34000
0.66000
1.00000
樣例輸入
4 8
0.81 0.34 0.73
0.85 0.50
0.22
0 0 0 0
1 0 1 0
0 1 1 0
1 1 1 0
0 0 0 1
1 0 0 1
0 1 0 1
1 1 1 1
樣例輸出
0.00000
0.61095
0.38546
0.80232
0.19768
0.61454
0.38905
1.00000
樣例輸入
5 20
0.45 0.28 0.48 0.59
0.61 0.88 0.66
0.19 0.67
0.11
0 0 0 0 0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
1 0 1 0 0
1 0 0 1 0
1 1 0 1 0
0 0 1 1 0
1 0 1 1 0
1 1 1 1 0
0 0 0 0 1
0 1 0 0 1
1 1 0 0 1
0 0 1 0 1
0 1 1 0 1
0 1 0 1 1
1 1 0 1 1
1 0 1 1 1
0 1 1 1 1
1 1 1 1 1
樣例輸出
0.00000
0.15693
0.30992
0.16074
0.35568
0.28030
0.63788
0.31579
0.52478
0.85575
0.14425
0.47522
0.68421
0.36212
0.71970
0.64432
0.83926
0.69008
0.84307
1.00000
評測用例規模與約定
  總共 20 組評測資料。對於第 i 組資料(1 ≤ i ≤ 20):若 i ≤ 10,n=⌈i / 2⌉;若 i > 10,n = i-5。