Time of Update: 2018-12-04
這道題的題目很難懂。。。雖然我自認為英語還不錯。。。同樣看不懂題目的同學可以看看這裡的解釋http://www.byvoid.com/blog/usaco-323-spinning-wheels/同時那裡的做法也非常可取,簡單明了,對0~359每個角度對每個輪子逐一判斷(當然,要具體到每個輪子的每個缺口)。大神總能寫出簡單高效的代碼http://belbesy.wordpress.com/2012/08/14/usaco-3-2-3-spinning-wheels/。我在謹慎考慮自己是不是改行搬
Time of Update: 2018-12-04
這道題剛開始用搜尋做的,即遍曆每種特惠的可能次數,最後取最省的組合。雖然用到了剪枝(噹噹前的費用已經超過了當前最省的組合,就不必接著考慮後面的特惠了),但是仍然效率特別低,在遇到後面的測試點的時候程式就無止境地跑下去了。後來看到網上說用動態規劃,因為最多隻有5種商品,每種商品最多買5個,所以狀態總數特別少,只有6^5=7776。所以用動態規劃把表填了就好。簡單總結:1.每次做題對狀態總數要有個大致的估計,像最近做的這幾道題,如果狀態空間很小(運算重量級萬或運算輕量級十萬以下),直接枚舉就好(會通
Time of Update: 2018-12-04
這道題也是看網上的解題報告得出的解法。。。首先,knight接king的點不需要在整個棋盤枚舉,king最多move兩步。這個是能夠通過所有測試點的。至於為什麼這樣,網上也搜到過證明,但是無心看了。其次,floyd是個非常低效的演算法,因為它確定無疑的要n^3的時間複雜度,適合於密集圖(因為演算法和邊的個數無關),但是我們遇到的一般是稀疏圖。SPFA甚至BFS都更好。之前看johnson演算法似乎是適用於稀疏圖的。再次,usaco給的標程沒看懂。。。/*ID: thestor1LANG: C++
Time of Update: 2018-12-04
只想到了暴力的方法,時間複雜度是O(n^3),最後一個測試點過不去。網上看到了動態規劃的方法,見http://www.byvoid.com/blog/usaco-334-home-on-the-range/。感覺遞推關係式還是很不容易想到的。當然,想到就很簡單了。代碼如下:/*ID: thestor1LANG: C++TASK: range*/#include <iostream>#include <cmath>#include
Time of Update: 2018-12-04
腦子真不行了。。。 明顯是個動態規劃,運算式都寫出來了,仍然在想如何用動態規劃而不用遞迴。。。。最後用了Recursion with memorization,其實和動態規劃也差不多,估計能好點(只計算和記錄實際需要的)。代碼如下:/*ID: thestor1LANG: C++TASK: game1*/#include <iostream>#include <cmath>#include <cstdio>#include
Time of Update: 2018-12-04
旅行商問題是個熟知的問題。這次是因為coursera上面選的演算法課而寫代碼實現。這裡做個簡單總結。測試程式:2520833.3333 17100.000020900.0000 17066.666721300.0000 13016.666721600.0000 14150.000021600.0000 14966.666721600.0000 16500.000022183.3333 13133.333322583.3333 14300.000022683.3333 12716.66672361
Time of Update: 2018-12-04
這道題大神解釋得很清楚,包括我根本沒有意識到的最佳化(同面額的郵票種類大於5的情況解是一樣的)。我一開始也是按照遞迴深搜做的,效果比較差,應該是剪枝的地方沒有考慮情況。這道題剪枝同時考慮效率和正確性還是比較難的。後來按照最直觀的四重迴圈做的。因為郵票組合最多四種。具體分析可以移步大神的解題報告:http://blog.csdn.net/cugbliang/article/details/2742242代碼寫得比較繁瑣,重複代碼比較多。另外,對STL中的vector實現還是不清楚,具體來說就是cl
Time of Update: 2018-12-04
這是道深搜的題目,不過需要回溯。很早就看了這位同學的提示,所以沒出啥問題。“Slyar:說一下題目大意。給出一個國際棋盤的大小,判斷馬能否不重複的走過所有格,並記錄下其中按字典序排列的第一種路徑。"馬的遍曆"是一道經典回溯題,當然還是DFS...這題有3個要密切注意的地方:1、題目要求以"lexicographically"方式輸出,也就是字典序...一開始沒看懂這個詞結果WA了N次...要以字典序輸出路徑,那麼方向數組就要以特殊的順序排列了...這樣只要每次從dfs(1,1)開始搜尋,第一個成
Time of Update: 2018-12-04
#include <iostream>#include <queue>using namespace std;bool checked[64];//int xstep[8] = {-1, -2, -2, -1, 1, 2, 2, 1};//int ystep[8] = {-2, -1, 1, 2, -2, -1, 1, 2};int knightmove(int sx, int sy, int ex, int ey, int len){int move =
Time of Update: 2018-12-04
這道題是道廣搜題,因為爬蟲等寫過,所以隊列還比較清楚,基本上就是一個set儲存已訪問過的(網域名稱或這裡的素數)還有一個隊列儲存要訪問的內容。我這裡的做法是兩個隊列,一個隊列cur儲存現在正在處理的素數,另一個隊列next儲存處理過程中出現的新素數,也就是多一次變換之後的素數。處理或者說變換的過程就是把每位(1~4位)從0~9都試一遍(不能和原來的數相同,且最高位不能變成0即可)。這樣一直從源素數變為目標素數為止。感覺AC了之後看代碼改進代碼的動力就不足了。。。一個比較容易想到的改進方法是用素數
Time of Update: 2018-12-04
這道題就是個簡單的深搜題,不過需要剪枝。首先addition
Time of Update: 2018-12-04
這道題也是usaco上的題,所以有測試資料,幫著調試了兩個bug。題中已經給出了所有的6種情況(4和5是一樣的),所以按照這六種情況嘗試就好了。對每種情況,矩形有不同的排列。比如case1是1種,case2是4種,case3是C_4^2,case4case5是c_4^2,case6是全排列。矩形本身有可以旋轉,所以四個矩形關於旋轉與否有2^4=16種狀態。然後就是羅列上述情況,記錄最小面積(及對應的寬)就可以了。#include <cstdio>#include
Time of Update: 2018-12-04
這道題首先是從USACO上看到的,然後用特別標準的BFS(隊列+set)從初始狀態到目標狀態(全是0)轉換。剛開始用一個int表示一個狀態,用一個10^9的bool數組記錄是否被訪問過,結果超出了空間。改成map<int>記錄後時間超了。權衡之下多加了個hash,因為每位只能取0~3(分別代表12,3,6,9),所以只需要4^9空間。這樣就通過了usaco的測試。代碼如下:#include <cstdio>#include <cstdlib>#include
Time of Update: 2018-12-04
剛開始用Floyd
Time of Update: 2018-12-04
自從開始做POJ後我對1 million就沒有恐懼感了,直接分配個這麼大的空間來儲存素數表。感覺空間換時間是個主旋律。素數表的產生用素數篩選法(小學競賽學到的)很快。方法是從2開始,對每個目前還標記為素數的數(初始情況下每個數都標記為素數),把它的所有倍數都標記為非素數。這些掃描過去後,一直沒被標記的(即保持為素數的)就是所有的素數。之後的事情就比較簡單了,對等差序列中的每個數一個個去查預先產生的素數表,一直數到第n個素數輸出即可。用時32ms。代碼如下:#include
Time of Update: 2018-12-04
按照USACO上面講的哈密頓迴路演算法做的,不是完全懂。。。大致理解是那種方法對任一節點,會先處理完別的節點,然後才將這個節點加到路徑裡面。所以最後獲得的是一個路徑的倒序。如果你想要獲得正確的序列(字典序,從小到大),那麼你仍舊需要按照你想要的順序來(即從較小的那個奇數度的點開始,然後每次處理的時候先處理鄰接節點中最小的那個),最後倒序輸出就好。代碼如下:/*ID: thestor1LANG: C++TASK: fence*/#include <iostream>#include &
Time of Update: 2018-12-04
2SAT是P問題,能在多項式時間內解決。這裡對方法之一進行總結。測試資料格式如下:1000000-383037 -585864575603 -494722-628477 805085-502855 685868923336 -606921-653863 424389333542 -656925-809061 874253即範圍為1~1000000,“-”號表示取逆。比如-383037 -585864表示~383037U~585864,575603
Time of Update: 2018-12-04
問號運算式,C語言中特有的一種用法,很容易遺忘,但可以使程式更加簡潔,方便易懂 下面用兩個數比較大小來做一個對比(部分代碼) 代碼1——if……else……: bigger = x;if(x<y)bigger = y;printf("the bigger number is %d",bigger); 代碼2——問號運算式(……?……:……): printf("the bigger number is %d",x>y?x:y); 或者 bigger =
Time of Update: 2018-12-04
最近用了用gVim這款編譯器,感覺還是蠻不錯的,就是那個字型。。。那個配色。。。相當的令人不敢恭維啊。。。於是我就想更改一下字型和配色,但是當我更改完成重啟gVim後發現有變成以前的樣子了。。。如果每次都這樣的話那不是煩死了,於是上網查了一下,但是找了半天都沒用,開啟gVim時還報錯。。。不知道這是為什麼,也許是我加的位置不對吧。。。 管他的。。。反正現在搞定了。。。在gvim安裝檔案下找到“_vimrc”檔案,然後用你自己喜歡的文字編輯器開啟(記事本也行),然後在“behave
Time of Update: 2018-12-04
水題。求最長公用子串。典型的動態規劃題。不過還是有注意的地方,比如數組下標為負的處理。我用的是加判斷特殊處理,也見到多存一行(一列)的方法。剛開始用cin.eof()結果一直WA,按照poj discuss裡面討論的cin>>str1>>str2的方法過了。還沒弄清這兩者的區別。#include <iostream>#include <string>using namespace std;const int N = 201;int