[USACO] OPEN11 Bronze Division

PROBLEM 11: bfire

題目說了一大堆,其實抽象成編程問題就是:給定N個數1~n放在編號爲1~n的位置上,現在進行移動使得n1放到n2的位置上,n2放到n4的位置上,nk放到n2k的位置上,如果n2k越界則從位置1接着計數,依次類推,問哪個數會出現在1號位置或者哪個數其將要放的位置上的數是已經被移動過的了?舉例來說:

1 2 3 -> 2

1 2 3 4 -> 4

1 2 3 4 5 -> 3

1 2 3 4 5 6 -> 4

解法其實很簡單,模擬一下數字的移動過程就行了,邊界條件就是上述的那兩個停止條件。

 


 

 


 

注意註釋部分,爲了方便,我的數組下標是從1開始的,這樣所有2的k次冪,比如128,求得的結果爲0,其實應該是128,所以不應該取模,直接減去一個n就可以了。

 

<------------------------------------------------------------------------瀟灑的分割線------------------------------------------------------------------------------------------->

 

PROBLEM 12: ssort

有點像快排,非常清晰的遞歸求解,測試全過,爽!

 


 

 


 

<------------------------------------------------------------------------幽怨的分割線------------------------------------------------------------------------------------------->

 

PROBLEM 13: space3d

看了一下分析,提到了一個Flood Fill算法,上網搜了搜,寫了一個遞歸的解決方案,結果segmentation fault。。。

想了一下應該是棧溢出了,遞歸的層次太深了

參考這篇文章《Flood-Fill 種子填充》 

 

繼續優化,參考了這篇文章《種子填充的優化》

也沒怎麼仔細看,就看個思路,利用隊列解決遞歸的低效,下面是代碼

怎麼說呢,首先程序寫的相當爛!那六個if語句真是爛透了!!看看別人的程序就知道了。。。(這個以後會改進

其次,讓我耗了半個下午的地方就是內存分配超出限制,queue數組和visit數組都聲明爲int類型時,程序超出內存限制

看了別人的解法嘗試着把這兩個數組聲明爲char類型,就過了,無語。。。

char visit -> 15636KB

char queue -> 9784KB

char both -> 6852KB

 

 

 

<------------------------------------------------------------------------蛋疼的分割線------------------------------------------------------------------------------------------->

 

PROBLEM 14: stringe

題目很簡單,不過竟然segmentation fault!!原來定義緩衝區長度定義小了,比如

0 9 CHESS這個數據,其實執行玩之後應該有2的9次冪個CHESS,所以需要修正宏定義:

#define MAX_LEN LEN * 12 改成

#define MAX_LEN LEN * 1<<12

最大的開銷是需要分配兩個400多K的靜態數組。。。

下面是程序

 


 

 


 

結果你妹的超時了!繼續優化,去掉結構體,串長賦值給一個變量,兩個緩衝區交替輸出結果,避免不必要的字符串拷貝,很像圖像處理中的後備緩衝區的用法。。。

 

 


此題再一次印證了“程序不是調試出來的”這一警句,寫程序時就應該注意到空間分配,程序效率等問題,良好的設計才能產出良好的結果,程序就是要追求簡單,高效,像你前一個程序,冗餘的字符串拷貝難道不需要時間嗎?擦!

 

 

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