A. Up and Down
PKU 3912
http://poj.org/problem?id=3912
題意:給定一個(gè)一維的棋盤,范圍為[0, W] (W <= 1000,000,000),某兩個(gè)點(diǎn)之間有梯子或蟲洞,梯子的下端點(diǎn)到上端點(diǎn)以及蟲洞的上端點(diǎn)到下端點(diǎn)花費(fèi)的步數(shù)為0,其它任意點(diǎn)之間的距離通過跳躍來計(jì)算,最多每次跳躍不超過S格(S<= 6),跳躍的過程中如果跳到梯子的下端點(diǎn)或者蟲洞的上端點(diǎn)就會被直接傳送到另一端,并且每次跳躍只能從小的點(diǎn)跳到大的點(diǎn)(蟲洞是個(gè)例外),求從0到W的最短距離。

圖A-1
題解:
離散化 + SPFA。
將所有梯子和蟲洞的兩端點(diǎn)、0和W以及他們往前往后S步以內(nèi)的數(shù)全部記錄下來,梯子和蟲洞有P(P <= 40)個(gè),加上起點(diǎn)終點(diǎn),總共82個(gè)點(diǎn),算上前后各六步,總共82 * 13 = 1066個(gè)點(diǎn),然后將這些點(diǎn)排序后離散化,最后就是要構(gòu)建一個(gè)網(wǎng)絡(luò)圖,通過網(wǎng)絡(luò)求0到W的最短路,最短路可以用SPFA求解。
談?wù)劷▓D的過程,對于任意兩個(gè)點(diǎn),他們之間必定可以連一條邊,然后有一個(gè)步數(shù)表示邊的權(quán)值(這里的步數(shù)也可能是正無窮,也即永遠(yuǎn)都無法到達(dá))。
對于任意兩個(gè)點(diǎn)(u, v),他們的步數(shù)w(u, v)(邊權(quán))我們做如下討論(這里的u、v是離散化后的點(diǎn)):
1)如果u是梯子的下端點(diǎn),v是梯子的上端點(diǎn) 或者 u是蟲洞的上端點(diǎn),v是蟲洞的下端點(diǎn),那么w(u, v) = 0,否則進(jìn)入2)的判斷;
2)如果u的編號大于v,w(u, v) = inf,表示永遠(yuǎn)不可達(dá),因?yàn)槟炒翁S只能從小的點(diǎn)跳到大的點(diǎn),否則進(jìn)入3)的判斷;
3)如果u的實(shí)際位置和v的實(shí)際位置差值小于等于S,則w(u, v) = 1;
4)檢查u和v之間是否有蟲洞的上端點(diǎn)或者梯子的下端點(diǎn),之后將這兩種點(diǎn)稱為X點(diǎn)
a)如果有,判斷他們是否連續(xù),
i) 如果不連續(xù)w(u, v) = inf(這一步這么做是為了簡單化,試想一下,如果X點(diǎn)不是全部連續(xù),說明u可以先跳到他們中間的某個(gè)非X的點(diǎn),然后再跳到v點(diǎn),這一步是通過SPFA來實(shí)現(xiàn)迭代的,建邊的時(shí)候可以不考慮)。
ii)如果連續(xù),判斷他們連續(xù)的格子的數(shù)目,如果大于等于S說明這個(gè)連續(xù)的塊必定跳不過去,所以w(u, v) = inf,否則可以先跳到最先的一個(gè)X點(diǎn)的前面一個(gè)點(diǎn),然后經(jīng)過一步S跳躍將這個(gè)連續(xù)塊跳過去,再跳到v。
b)如果沒有X點(diǎn),那么直接從u點(diǎn)跳到v點(diǎn)。
這里我們需要計(jì)算從a點(diǎn)跳到b點(diǎn)不考慮蟲洞和梯子的最短距離,可以貪心的跳,每次往大的跳,直到剩余格子不足S格,即(b-a + S-1) / S (b-a對S求商的上整)。
邊建立完成就可以利用廣搜求解0-W的最短路了。
B. Gnome Sequencing
PKU 3913 http://poj.org/problem?id=3913
水題,判斷三個(gè)數(shù)是全遞增還是全遞減還是無序。
C. DuLL
PKU 3914 http://poj.org/problem?id=3914
題意:給定一些dll文件和它占用的內(nèi)存空間,以及一些可執(zhí)行程序占用的內(nèi)存空間和它依賴的dll文件,程序以進(jìn)程為單位,兩個(gè)相同的程序可能有不同的進(jìn)程,進(jìn)行一些下列的操作:
1)某個(gè)程序運(yùn)行的時(shí)候需要它依賴的dll文件也加載到內(nèi)存中,多個(gè)程序可以共用一個(gè)dll文件;
2)某個(gè)程序退出的時(shí)候,如果它所依賴的dll文件沒有其它程序使用,需要釋放這段內(nèi)存空間;
給定一系列的運(yùn)行進(jìn)程,求某個(gè)時(shí)刻的最大內(nèi)存占用。
題解:HASH的簡單應(yīng)用。
初始化內(nèi)存占用V = 0,
對于給定的輸入進(jìn)程:
1)如果是新運(yùn)行的進(jìn)程,將V加上這個(gè)進(jìn)程的內(nèi)存占用,并將它所有依賴的dll文件檢查一遍,如果引用計(jì)數(shù)為0,則將對應(yīng)dll文件的內(nèi)存累加到V上,引用計(jì)數(shù)+1;
2)如果是退出進(jìn)程,將V減去這個(gè)進(jìn)程的內(nèi)存占用,并將它所有依賴的dll文件檢查一遍,如果引用計(jì)數(shù)為1,則用V減去對應(yīng)dll文件的占用量,引用計(jì)數(shù)-1;
每次操作記錄最大的V就是最后的答案。
D. Black Vienna
PKU 3915 http://poj.org/problem?id=3915
題意:三個(gè)人,每個(gè)人五張牌,互相不知道對方的牌,還有額外的三張牌放在一邊(所有牌編號為A - R)。每一輪,由 (i-1)%3+1 (1 <= i <= 15) 號玩家進(jìn)行發(fā)問,問Ai (1 <= Ai <= 3) 號玩家XYZ(代表任意三個(gè)牌號)三張牌中有多少張?jiān)谒稚?,然后他回?/span>Bi (0 <= Bi <= 3),問經(jīng)過多少輪之后有某位玩家知道 額外 的那三張牌是什么。
題解:dfs枚舉 + 剪枝。
首先枚舉到某個(gè)詢問i的時(shí)候玩家j能夠猜出的那三張牌的情況,如果枚舉完所有情況最后確定只有一個(gè)解滿足條件的時(shí)候,那個(gè)詢問的編號i就是答案了。
類似IDA*的思路,先枚舉詢問最大深度,如果到達(dá)那個(gè)詢問不能確定額外的那三張牌或者有很多種情況,那么說明還需要更多的詢問,迭代深度繼續(xù)枚舉。
對于某個(gè)詢問i,找到詢問的那三張牌中已經(jīng)是Ai號選手的數(shù)量ansCnt,以及尚未確定牌的歸屬的牌的數(shù)量xCnt,如果已經(jīng)確定位置的牌數(shù)量 大于 實(shí)際他回答的數(shù)量(ansCnt > Bi)或者 尚未確定位置的牌數(shù)量 + 已經(jīng)確定為他的牌數(shù)量 小于 實(shí)際他回答的數(shù)量(ansCnt + xCnt < Bi)都是不合理的情況,剪枝,不用繼續(xù)往下搜索;
否則,將(Bi - ansCnt)張牌分配給Ai,(xCnt - (Bi - ansCnt))張牌分配給其它兩位玩家以及額外的那一堆,這里需要用到嵌套dfs枚舉,枚舉完后進(jìn)入下一個(gè)詢問的枚舉,每次詢問的時(shí)候可以有幾個(gè)剪枝:
1)如果某個(gè)階段某個(gè)人的牌數(shù)超過5張;
2)枚舉的解的數(shù)量超過2個(gè);
3) 對于一次完全枚舉,枚舉完所有詢問后還是有無法確定三張額外的牌的情況;
E. Duplicate Removal
PKU 3916 http://poj.org/problem?id=3916
水題,對輸入的元素進(jìn)行連續(xù)判重輸出。
F. Rock, Paper, Scissors
PKU 3917 http://poj.org/problem?id=3917
水題,剪刀石頭布!O_o
G. A to Z Numerals
PKU 3918 http://poj.org/problem?id=3918
題意:復(fù)雜模擬。(沒做出來,#-_-# 樣例的98是怎么出來的呀!!?。?/span>
H. Cell Towers
PKU 3919 http://poj.org/problem?id=3919
題意:給出一條曲折的連續(xù)線段,曲線從起點(diǎn)開始每經(jīng)過一個(gè)長度為1的單位會放置一個(gè)守衛(wèi)K,在曲線以外的某些地方會有T(T <= 10)個(gè)信號發(fā)射器,用A、B、C...來表示,每個(gè)信號發(fā)射器有它的信號強(qiáng)度Pi,每個(gè)信號發(fā)射器到守衛(wèi)K的距離如果是D,那么它能接收到的信號值為Pi / D2的最近整數(shù),并且對于守衛(wèi)K,它只會接收最大的信號值,如果有多個(gè)發(fā)射器對于K的信號值相同,那么選擇字典序最小的發(fā)射器。需要求是一些守衛(wèi)集合,這些守衛(wèi)分別和它的前一個(gè)守衛(wèi)所接收的信號發(fā)射器不一樣。
題解:計(jì)算幾何、向量的簡單應(yīng)用。
對于每條射線,終點(diǎn)減去起點(diǎn),再單位化后就可以得到這條射線的單位向量,利用這一點(diǎn)可以很簡單的將所有守衛(wèi)的坐標(biāo)求出來,然后對于每個(gè)守衛(wèi)判斷接收的是哪個(gè)發(fā)射器,判斷和之前那個(gè)守衛(wèi)是否相同即可。
需要注意的是最后一個(gè)守衛(wèi),當(dāng)和上一個(gè)守衛(wèi)距離小于0.5的時(shí)候不會建立新的守衛(wèi)。
I. RIPOFF
PKU 3920 http://poj.org/problem?id=3920
題意:給定N(N <= 200)個(gè)數(shù)的一維數(shù)組A,取不大于T+2個(gè)數(shù),每相鄰兩個(gè)數(shù)之間的下標(biāo)不大于S,問最大的取值總和(第0個(gè)和第N+1個(gè)數(shù)必取,且權(quán)值為0)。
題解:動(dòng)態(tài)規(guī)劃。
DP[i][j] 表示第j個(gè)數(shù)取 A[i]的最大值,那么狀態(tài)轉(zhuǎn)移方程可以表示為:
DP[i][j] = max{ DP[k][j-1] + A[i], i > k > i-1-S && k >= 0};
特殊的,DP[0][0] = 0,其他的DP[i][j] 都初始化為INF;
最后計(jì)算出的DP[N+1][i]中的最大值就是答案了。