顯示具有 zoj 標籤的文章。 顯示所有文章
顯示具有 zoj 標籤的文章。 顯示所有文章

2010年5月19日 星期三

ZOJ3334 Body Check

ZOJ 5月月賽題目。

大意是給了n個實數,代表了n個人需要完成身體檢的時間。有m個醫生為他們作身體檢查。一個人可以分開不同時段給不同醫生作身體檢查,唯獨是一個人不可以同一時間給多於一個醫生作身體檢查。另,醫院時刻也只能有這兩個情況﹕要麼m個醫生都在為不同的人作身體檢查,要麼就只有一個人在加班。問,最少需要多久能為所有人完成檢查?

首先,可以通過安排,使得工模式為「m位醫生工作 --> 一醫生工作」。如果一個人不可以分開時段給不同醫生檢查,可以得出問題的一種特例就是partition問題,是NP-Complete的。正因為可以任意分開時段,我們第一個想法就是直接取平均數。不過需要注意另一個限制「一個人不可以同一時間給多於一個醫生作身體檢查」。因為像5和5.1而m=2的話,雖然平均數是5.05,但是第二個人的0.1無法分拆成兩個不同時段。可以直接觀察得出,假若有一個需時大於平均數的話,剩出來的時間基本上無法放到任何平均數線之前,因為這位人本身已經獨佔了平均數線以前的時段。若然沒有這樣的問題的話,那麼我們必定可以安排所有人在平數時限前完成檢查。基於平均數本是最優的,所以我conjecture了這個算法﹕
為所有數取平均數,然後檢查每個數,若大於平均數,把多出的加到答案裡,然後把它們設為平均數,完成後重新再取平均數檢查;否則把平均數加到答案裡,並輸出答案。

一次AC。

2009年12月23日 星期三

ZOJ 3282 Go Downstairs

ZOJ 12月月賽題目。

給出每行有及僅有一個梯級,有或沒有金幣,幣值。每一行的梯級必然在上一行的梯級的左方或右方。一個在這張圖上的遊戲是這樣的﹕首玩者可以以費用選擇移去該行的梯級,麼次玩者會垂直掉到最接近的梯級,或離開地圖。如果該梯級有金幣的話也一併移掉。次玩者可以選擇修復剛移除的梯級(最多只能操作次),但不能修復原有的金幣。每當他走到有金幣的話他必定會取走。次玩者必然從最頂層出發。首玩者先操作。當次玩者跳離地圖,遊戲便結束。

問,若果金幣全屬首玩家所有,那麼在雙方採取最優策略底下,首玩家的損失最小是甚麼。

首先,不難留意這張圖可以化為有向無環圖。頂層梯級為出發點,並構造虛擬終點(即跳離地圖的狀態)。然後可以結論這道題目是Minimax題。簡單的動態規劃可以搞定。狀態為,當中是行數、是用了多少次修復,為玩者編號。轉移方程也很一般,不贅述。

此題唯一比較不足的地方是,應該容許兩層梯級可以共處同一垂直位置,而且應該考慮同一梯級可以重覆修復及移除。但是題目實際上如果移除了,某人就必須走下一級。這樣,下列的情況會得出不一樣的答案﹕

5 5 5 1 2
G....
G....
G....
G....
G....

(注意根據原題描述,此情況絕不會發生)