香港電腦奧林匹克競賽 2016/17 高級組
題目總覽
編號 名稱 執行時間限制 記憶體限制 子任務
S171 電視收視 1.000 s 256 MB 7 + 8 + 12 + 21 + 9 + 17 + 26 S172 弱化術 1.000 s 256 MB 15 + 30 + 25 + 30 S173 捕捉怪獸 1.000 s 256 MB 9 + 9 + 22 + 23 + 37 S174 魔幻三角 II 0.500 s 256 MB 11 + 15 + 10 + 18 + 25 + 21
注意:
除非特別注明,否則輸入輸出將依照以下格式:
同一行中,數字與數字或字元之間需有一個空格。
同一行中,字元與字元之間並無空格。
每個字串需放在獨立的行。
輸出將自動被修正如下:每行最尾的連續的空格會被刪除,及在輸出最後補上換行符(如沒有)。其他格式問題 則不會修正。
C++ 使用者請注意 cin / cout 可能導致輸入輸出樽頸使程式執行變慢。
有些題目可能需要使用 64 位元整數。在 Pascal 中它是 int64 。在 C/C++ 中它是 long long 而其 scanf / printf 代號是 %lld 。
所有題目均有細分多個子任務,你需要通過該子任務中的所有測試數據才能得到分數。
執行時間限制: 1.000 s / 記憶體限制: 256 MB
S171 - 電視收視
電視收視是一種把電視節目觀眾量化的方法。透過估計觀眾數目,電視台及廣告商可得知電視節目的受歡迎程 度。量度電視收視的一種方法是選定一些家庭並在其電視旁安裝遙控信號感應器,感應用戶按下遙控上的開關 及轉台按鍵,並定時將資料上傳至收視統計機構。例如假設電視初始時是關上的,若開關鍵分別於下午2時及下 午3時共按下了兩次,那麼該家庭觀看了一小時的電視節目。你的任務是編寫一個程序來處理一天之間,各家庭 按下遙控按鍵而收集到的感應器數據。
位元組國(Byteland)中一共有 N 條電視頻道,以 1, 2, … , N 編號。頻道 i 在這天編排了 Ci 個節目,而第 j 個 節目長 Di,j 秒。全部頻道的首個節目都在午夜0時 (t = 0) 開始,而全部頻道的最後一個節目都在翌日午夜0時 (t = 86400) 完結。兩個節目之間並無休台時間。
遙控上有 N + 1 個按鍵,按鍵 0 代表開關鍵而按鍵 1 至 N 分別對應各頻道。當按下開關鍵時,電視會開啟
(若本身是關閉的)或關上(若本身是開著的)。而按下頻道鍵 j 時,電視會調至頻道 j 當且僅當電視是開著 的,但若電視已經調至頻道 j,此並無作用。按下按鍵只需極短的時間。一個家庭會被視為正收看某個節目當 且僅當電視是開著的並已調至播放該節目之頻道。
M 個家庭參與了這個統計,並以 1, 2, … , M 編號。在午夜0時,家庭 i 的電視的初始狀態可用兩個整數表示: Pi
及 Qi。若電視是開著的,則 Pi= 1,否則 Pi= 0。而 Qi 是一個 1 至 M 之間(含)的整數,代表初始時調至 的頻道。
現共有 L 項按時序排列的感應器數據,每項數據由三個整數組成: Ti、Hi 及 Bi。Ti 按下按鍵時,自午夜0時 經過了的秒數(假設在秒的開始按下按鍵),Hi 是按下按鍵的家庭編號,最後 Bi 是個 0 至 M 之間(含)的 整數,記錄按下了的按鍵。
基於這些感應器數據,你的程序應輸出一份包含每個節目的平均收視的報告。平均收視的計算方式為所有家庭 用於收看該節目的時間秒數總和,除以該節目的長度。例如有一長度為60分鐘的節目,若有2個家庭收看30分 鐘及1個家庭收看45分鐘,那麼平均收視為 1800+1800+2700
3600 = 1.75。
我們強烈建議你先完成子任務來理解題目及輸入格式。
輸入
第一行包含 3 個整數 N、M 和 L,分別為頻道數目、家庭數目及感應器數據數目。
接著 N 行中的第 i 行描述頻道 i 的節目。行的第一個整數 Ci (1 ≤ Ci≤ 86400) 是頻道該天編排了的節目數 目 , 並 緊 接 Ci 個 整 數 , 其 中 第 j 個 整 數 Di,j (1 ≤ Di,j≤ 86400) 是 第 j 個 節 目 的 長 度 ( 秒 ) 。 保 證
∑Cij=1Di,j= 86400。
接著 M 行描述家庭中的電視的初始狀態。第 i 行包含兩個整數 Pi (Pi∈ {0, 1}) 及 Qi (1 ≤ Qi≤ N),分別代表 電視是否開著及調至的頻道。
接著 L 行描述感應器數據。第 i 行包含3個整數 Ti (0 ≤ Ti≤ 86400)、 Hi (1 ≤ Hi≤ M) 及 Bi (0 ≤ Bi≤ N),
分別代表按下按鍵的時間,家庭編號及按下的按鍵。這些數據是按時序排列的,即 Ti≤ Ti+1。若 Ti= Ti+1,那 麼數據 i + 1 緊接 i 發生。
輸出
輸出 N 行,一條頻道一行。在第 i 行輸出 Ci 個以空格隔開的數字,依次為各節目的平均收視。
若對於每對真正答案 a 及你的輸出 x,符合 max(1,a)|x−a| ≤ 10−6 的話,你的答案會被視為正確。即是,絕對誤差及 相對誤差較小者不可大於 10−6。注意不可用科學記數法輸出。另外,若輸出小數點,則小數點前後均須有至少 一個數位。
樣例
輸入 輸出
1
1 1 412 7200 7200 7200 7200 7200 7200 7200 7200 7200 7200 7200 7200 0 1
14400 1 0 28800 1 0 36000 1 0 72000 1 0
0 0 1 1 0 1 1 1 1 1 0 0
2
1 4 43 6780 60060 19560 1 1
1 1 1 1 1 1 960 4 0 49920 3 0 66840 2 0 66840 1 0
3.141593 2.718282 0
3
2 2 52 36000 50400 3 28800 28800 28800 0 2
1 1 9000 1 1 18000 2 2 36000 2 1 36000 1 0 54000 1 1
0.5 1.642857 0.375 0.875 0
子任務
對於所有數據: 1 ≤ N, M, L ≤ 100000, ∑Ni=1Ci≤ 100000
佔分 約束條件
1 7 只有一條頻道,該頻道有 12 個兩小時長的節目。只有一個家庭,該家庭不會在節目中途開啟或關上 電視。該家庭不會按下頻道鍵。
N = M = 1 C1= 12 D1,j= 7200 Ti 是 7200 的倍數 Bi= 0
2 8 只有一條頻道。只有一個家庭,該家庭不會按下頻道鍵。
N = M = 1 Bi= 0
3 12 只有一條頻道。可以有多個家庭,但不會按下頻道鍵。
N = 1 Bi= 0
4 21 所有家庭均不會按下頻道鍵。
Bi= 0
5 9 有多達 100 條頻道,每條頻道有 12 個兩小時長的節目。只有一個家庭,該家庭不會在節目中途開啟 或關上電視或按下頻道鍵。
1 ≤ N ≤ 100 M = 1 C1= 12 D1,j= 7200 Ti 是 7200 的倍數
6 17 有多達 100 條頻道。只有一個家庭。
1 ≤ N ≤ 100 M = 1
7 26 無額外約束
執行時間限制: 1.000 s / 記憶體限制: 256 MB
S172 - 弱化術
曼哈林王是 HKOI 學校最強的學生。他在這個學期考了 N 科,在第 i 科考得了 Ai 分。當然他得到非常好的成 綪,但是他很難過(很奇怪)。原來他想假裝自己很弱(更加奇怪),於是決定施魔法 (名為「弱化術」) 來降 低自己的分數。
曼哈林王的魔法可以施出 0 至 5 × 106 (含)次。每次他施魔法時,他可以指向自己當時最高分的一科,並把 那科的分數減去任意一個正整數 x,曼哈林王可以調整魔法的強度來控制這個正整數。因此, 每次施魔法時 x 的數值可以寫成一個序列 X1, X2, … , XK,這裡的 K 是施出魔法的數量, Xi(Xi> 0)是第 i 個魔法的 x 數 值。
為了可憐他那考了 N 科而第 i 科得了 Bi 分的室友 RB,曼克頓王想在施出一序列魔法後,自己的分數經排序後 會與 RB 的分數經排序後一模一樣。你可以協助曼頓王找出一個魔法序列去滿足他的心願嗎?
輸入
第一行有一個整數 N -- 科目的數量。
第二行有 N 個整數 A1, A2, … , AN。 (1 ≤ A1≤ A2≤ ⋯ ≤ AN) 第三行有 N 個整數 B1, B2, … , BN。 (1 ≤ B1≤ B2≤ ⋯ ≤ BN)
輸出
如果不存在任何答案,在唯一一行輪出 Impossible 。
否則的話,輪出一個魔法序列。第一行是一個非負整數 K (0 ≤ K ≤ 5 × 106),施出魔法的數量。然後輪出 K 行,第 i 行是正整數 Xi。如果答案存在的話,那麽保證存在一個答案滿足 K ≤ 5 × 106。
樣例
輸入 輸出
1
23 4 1 2
4 1 1 1 1
25%: 一個正確的序列但不是最短的。
2
23 4 1 2
2 2 2
50%: 序列是最短之一,但不是字典順序最大。
3
3 4 1 23 1
100%: 序列是最短序列之中字典順序最大的。
4
12 3
Impossible
子任務
對於所有數據: 1 ≤ N ≤ 100000, AN, BN ≤ 109
佔分 約束條件
1 15 1 ≤ N ≤ 3
2 30 1 ≤ N ≤ 8
3 25 1 ≤ N ≤ 5000
3 25 1 ≤ N ≤ 5000
4 30 無額外約束
計分
在一個子任務中:
如果答案存在而你的程序錯誤地輸出 Impossible ,或者當答案不存在而你的程序沒有輸出 Impossible ,你 不會得到該子任務的任何分數。
如果對於所有存在答案的測試數據,你的程序輸出正確的序列,而這個序列是所有正確序列之中最短的,並且 是在所有最短正確序列之中字典順序最大的,你會得到該子任務的 100% 分數。序列 A1, A2, … , AK 字典順序 大於 B1, B2, … , BK 當且僅當存在 i 使得 Ai> Bi 及 Aj= Bj 對於所有 j < i。
否則如果對於所有存在答案的測試數據,你的程序輸出正確的序列,而這個序列是所有正確序列之中最短之 一,你會得到該子任務的 50% 分數。
否則如果對於所有存在答案的測試數據,你的程序輸出任何正確的序列,你會得到該子任務 25% 的分數。
否則你不會得到該子任務的任何分數。
執行時間限制: 1.000 s / 記憶體限制: 256 MB
S173 - 捕捉怪獸
愛麗斯 (Alice) 是位元組國的一名怪獸訓練員。她的目標是要捕捉位元組國的所有怪獸,但卻未曾成功捕捉任何 一隻怪獸。
位 元 組 國 總 共 有 N 隻不同的怪獸,牠們獨自住在 N 個不同的洞穴,洞穴以 1 到 N 編號。瓊斯博士 (Dr.
Jones) 為了幫助這名可憐的訓練員,決定讓她使用自己共 M 個雷達。第 i 個雷達可以偵測 Li 個洞穴所住的怪 獸,然後按照一個隨意次序輸出怪獸名單。
在捕捉怪獸之前,愛麗斯需要知道每隻怪獸的住處,其中一個可行辨法就是利用瓊斯博士的雷達掃瞄結果。請 幫愛麗絲判斷雷達的掃瞄結果是否足夠讓她推斷出每隻怪獸的住處。
更精確而言,設 (p1, p2, … , pN) 為 (1, 2, … , N) 的排列使得第i隻怪獸的住處為洞穴 pi。當每一組有可能出現的 掃瞄結果均只對應一個排列時,雷達就稱之為足夠。
如果雷達已經足夠,就找出最細整數 K 使得首 K 個雷達已經足夠讓愛麗斯推斷出每隻怪獸的住處。
輸入
第一行只包含兩個整數,N 和 M,分別是怪獸的總數和雷達的總數。
其後 M 行中的第 i 行描述第 i 個雷達。第 i 行的第一個整數 Li (1 ≤ Li≤ N)是第 i 個雷達可以掃瞄的洞穴數 量,緊接的 Li 個不同的整數 Ci,1, Ci,2, … , Ci,Li (1 ≤ Ci,j≤ N) 則表示第 i 個雷達可以掃瞄的洞穴。
輸出
如果 M 個雷達已經足夠,請輸出最細整數 K 使得在輸入中的首 K 個雷達已經足夠讓愛麗斯推斷出每隻怪獸的 住處。
否則,請輸出 Impossible 。
樣例
輸入 輸出
1
4 32 1 2 2 1 3 3 2 3 4
2
2
5 32 1 2 2 1 3 3 2 3 4
3
3
6 3 Impossible子任務
對於所有數據: 1 ≤ N, M ≤ 200000, ∑Mi=1Li≤ 200000
佔分 約束條件
1 9 1 ≤ N, M ≤ 2
2 9 1 ≤ N ≤ 2
N × M ≤ 200000
3 22 1 ≤ N ≤ 10 N × M ≤ 200000
4 23 N × M ≤ 200000
5 37 無額外約束
執行時間限制: 0.500 s / 記憶體限制: 256 MB
S174 - 魔幻三角 II
考慮一個 N 層的三角形網格。它共有 N×(N+1)2 個頂點,而它的邊長是 N − 1。下圖顯示一個 N = 5 層的三角 形網格。
初始時,每個頂點上都寫有一個正整數。你想令這個三角形網格變得 K-魔幻。要判斷一個三角形網格是否 K- 魔幻,我們考慮所有三邊與網格線平行及邊長為 K 的三角形。對於每一個這些三角形,我們考慮它三個頂點的 和。如果對於任意兩個這樣的三角形 T1 和 T2,T1 的三個頂點之和與 T2 的三個頂點之和是相同的,那麽這個 三角形網格就是 K-魔幻。
如果給定的三角形網格並非 K-魔幻,你可以調整頂點上的數字來令它變成 K-魔幻。你可以付出 A 個金幣來把 一個頂點上的數字增加 1,或者付出 B 個金幣來把一個頂點上的數字減少 1。你可以進行這兩項操作任意多 次,但是每一個操作完成後,所有頂點上的數字必須要是正整數。
你的任務是找出最少須付多少個金幣才能令給定的三角形網格變成 K-魔幻。輸出最少須付的金幣數量,以及最 終三角形網格上每個頂點上的數字。
輸入
第一行是四個整數 N、A、B 和 K。
之後 N 行的第 i 行有 i 個數字,代表初始時三角形網格第 i 層的數字,由左至右。這些數字都是在 1 至 128 之 間(含)。
輸出
輸出 N + 1 行。
第一行輸出一個整數,最少須付出的金幣數量令這個三角形網格變成 K-魔幻。
樣例
輸入 輸出
1
5 1 10 31 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15 1 2 3 4 5 6 7 8 9 22 11 12 13 17 15 1 + 7 + 22 = 2 + 11 + 17 = 3 + 12 + 15 = 30
2
3 1 1 12 1 1 2 1 2
3 1 2 1 1 1 2
子任務
對於所有數據: 1 ≤ K < N ≤ 80, 1 ≤ A, B ≤ 50
佔分 約束條件
1 11 N = 3
K = 1 A = B = 1
2 15 N = 3
K = 1
3 10 N ≤ 6
K = 1
4 18 K = 1
5 25 N ≤ 10
6 21 無額外約束
6 21 無額外約束
計分
在一個子任務中:
如果你的程序對所有測試數據輸出的金幣數量和 K-魔幻三角形網格每個頂點上的數字都是正確的,你會得到 該子題目的 100% 分數。
否則的話,如果你的程序對所有測試數據輸出的金幣數量都是正確的,並且以正確格式輪出任何三角形網格每 個頂點上的數字,你會得到該子題目的 60% 分數。
否則的話,你不會得到任何分數。