a165: Q-2-14. 水槽
標籤 : 108高中全國賽
通過比率 : 4人/6人 ( 67% ) [非即時]
評分方式:
Tolerant

最近更新 : 2021-11-02 16:26

內容

我們用一排 n 個擋板建造水槽。擋板的寬度為1,高度為正整數且均不相同,水槽前後是兩片長寬均為無限大的玻璃板 (見下圖例)。

相鄰擋板的距離都是1,故相鄰二擋板之間會形成底面積1平方的水槽。
擋板由左而右依序由 0 到 n – 1編號,第 i 及 i + 1 檔板中間的水槽稱為水槽i。

現在將總量為 w 立方公分的水緩緩注入水槽i。

注意水量可能溢出到別的水槽,但是由於所有擋板高度都不同,所以每當溢出時,只會先從一個方向溢出。

請計算將總量為w立方公分的水緩緩注入水槽i後,所有水槽的水深。

本題最左的擋板與最右的擋板是所有擋板中最高的兩個,並且保證欲注入的水不會溢出到左右邊界之外;另外,所有水槽的最後水深一定都是整數。

以下圖為例,於水槽2注入17立方公分的水後,各水槽的水深依序為5, 5, 5, 1, 1, 0。

輸入說明

第一行有三個正整數n (3 ≤ n ≤ 105)、i (0 ≤ i≤ n – 2) 和 w (1 ≤ w ≤1012),分別代表擋板數、注水水槽編號,及水量。

第二行有 n 個以空白間隔的正整數,代表由左到右擋板的高度,每個擋板高度為正整數且不超過109)。

請注意注水量可能超過一個32-bit整數的範圍

輸出說明

輸出爲一行,共 n – 1 個整數,依序代表各個水槽水深,數字之間以一個空白間隔

範例輸入 #1
8 3 27
9 7 5 3 4 6 8 10
範例輸出 #1
0 6 6 6 6 3 0
測資資訊:
記憶體限制: 64 MB
公開 測資點#0 (20%): 1.0s , <1M
公開 測資點#1 (20%): 1.0s , <1M
公開 測資點#2 (20%): 1.0s , <1M
公開 測資點#3 (20%): 1.0s , <1M
公開 測資點#4 (20%): 1.0s , <1M
提示 :

我們維護一個水槽高度尚未被決定的區間[left,right),區間以外的水槽高度都已經確定。

遞迴函數 rec(left, right, water, input)計算水量water從編號input進入後區間的各高度。
如果區間只剩一個水槽,該水槽高度=水量,結束

否則,在區間中找出最高的隔板,假設此隔板高度為H。區間被此隔板分成左右兩邊,考慮下面三種情形:
 water >=(right-left)*H,水量足以讓兩邊都至少H,區間內所有水槽高度皆是相同的平均值,結束。
 水量不足以越過輸入這一邊,那麼,另外一邊一定不會有水,縮小區間遞迴呼叫。
 水量會越過輸入這一邊,那麼,輸入這一邊的水槽高度一定都是H,把水量扣掉後遞迴呼叫另外一邊。
為了要找出區間內的最高隔板,我們可以一開始把所有隔板的依照高度從高到低排列,每次要找某區間最高隔板時,我們檢視目前最高的隔板,如果在我們要的區間,那就找到了;如果不在我們要的區間,這個隔板以後也不會用到(想想為何),可以直接丟掉。因此,只要一開始把隔板排序後依序往後找就可以了,不需要特殊的資料結構,但是要把隔板的高度與位置一起存,所以需要一個兩個欄位資料的排序。

標籤:
108高中全國賽
出處:
AP325 [管理者: ]


編號 身分 題目 主題 人氣 發表日期
沒有發現任何「解題報告」