USACO 3.2 分析

 題目一:Factorials

題目大意:求n!的最後非0位。

算法:模擬

1.2的因子的個數顯然比5多很多;

2.可以預先根據5的個數估計出末尾0的個數,然後只需保存多餘2的個數,去更新末位的值;

3.實際做的時候沒有想到上述方法,而是鬼使神差地想到保存末5位,但是無法證明!

 

 

題目二:Stringsobits

題目大意:在所有長度爲N的1的位數不超過K的二進制數中(包含前導0),求出第I大的數

算法:DP

狀態轉移方程:S[I][J]表示長度爲I用1的個數不大於J的二進制數的個數;

S[I][J] = S[I-1][J]+S[I-1][J-1],很像C(A,B)的遞推公式啊!

初始條件:s[0][i] = 1,1 <= i <= K

還有一點要注意的是2^31 超過LONGINT的表示範圍,可以用UNSIGHED LONGINT,讀入格式scanf("%u", &a)

 

題目三:Spinning Wheels

題目大意:有若干個有缺口的轉動着的輪子,轉的過程是離散的,以時間1爲基本單位,求出什麼時候在某處光線可以通過。

一種思路是狀態仍是離散保存,只保存起始點和末端點,用時間更新初始座標,判斷的時候考慮到有些段可能跨越360的臨界,就要分別判斷是在360內還是360外。

特別注意:只要有一點縫隙,光就可以過!

 

 

還有一種思路是用BOOL來保存狀態,效率相對較低;

 

題目四:Feed Ratios

1.由於數據比較小,可以BRUTE FORCE,關鍵在於3點共線判斷的方法,不推薦用斜率的方法去做,最好用向量的方法去做;

2.本題可以用Cream方程組的知識去做,以下是USACO官方的解答

 

題目五:Magic Squares

算法:BFS

1.康託展開(Cantor),給出一個1-N的排列,求1-N的全排列字典序中的位置;

2.康託展開的逆運算是給出位置,找到這個排列。

3.這道題要用Cantor + Hash可以有效節約空間

 

題目六:Sweet Butter

算法:SPFA

題目大意:給出一張圖,有一些人在某些點,求出最小的集合代價。

由於這張圖邊比較稀疏,用鄰接表存好,且訪問起來更方便;

用SPFA分別求出任意兩點間的最短路。

 

很好,這一個星期的任務完成了,不過接下來還要奮戰學校的OJ啊!加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章