2011年3月19日 星期六

Codeforces #68

比賽題目較為簡單,但是仍然表現得不夠好。

A: 問給了4個互相不同的數,給了範圍,問當中有多少個數,使得在至少7種的不同排列中,該數在取模的順序下仍然保持不變。看了之後都不用懷疑,直接就暴搞了。但留意一下取模順序本來就是符合交換性的,即,因此只需對一種排列(例如輸入中的排列)下試了所有數看看是否在取模順序下不變即可。省卻了24!的排列。
然而,本題有的算法。假設,可知保持取模下不變的數只能在,即,其餘取模是多餘的。因此答案即是

B: 給定個整數,定義操作,使得操作後。給定,問經過若干次操作後,能使得的話,它們的數值最多為多少。

直接的想法就是二分答案。設為經過若干次操作後最終每個數的一致值,定義



不難看出總供給量總需求量。若則表示經過若干次操作後所有數皆等於。若則表示供過於求,即太低;若則表示供不應求,即太高。應用二分法求最大的使得供求相符即可。

C: 給了一個有向無環圖,最多6個頂點,而且是完全圖。每條邊有要求流量最少最多值,和啟動值。設在邊流量是,啟動值,則費用是。求一個可行的網絡流,源是點1,匯是點,需要符合上下限,要求流量最小,其次則要求費用最大。上下限最多是5,啟動費用最多是6。若沒有流量則毋需計算啟動費用。

明顯地數據範圍極小,可以考慮暴試。設為第點的注入量。對源點則有。DFS狀態為,當中。此程序會嘗試從點抽取之間的注入量,加到之中,然後按情況嘗試。當達到即可中止。但嘗試量最多是,肯定會超時。要應用一些prunning技巧。首先,當在狀態的時候,若已經大於最小流量值則中止嘗試。另,嘗試的時候,應直接取走其注入量,並留意是否,若否則中止搜索。

D: 待補。

沒有留言: