- 博客(193)
- 资源 (1)
- 收藏
- 关注
原创 Observer
C++ Code:#include #include #include #include class AbstractObserver{public: virtual int GetObserverId(void) const = 0; virtual void UpdateMethod(int temperature, int humidity) const = 0;}
2014-02-12 13:34:02
635
原创 Decorator
C++ Code:#include class Componet{public: virtual int CalCost(void) = 0;};class ComponetBase : public Componet{private: int _baseCost;public: ComponetBase(int bc) : _baseCost(bc) {} vi
2014-02-11 16:57:37
647
原创 Strategy
C++ Code:#include class AlgorithmInterface{public: virtual int CalAns(int lhs, int rhs) = 0;};class SubMethod : public AlgorithmInterface{public: virtual int CalAns(int lhs, int rhs) { re
2014-02-11 16:41:22
561
原创 fzu_1894 志願者選拔( 單調隊列 )
分析:如果使用純暴力的話會TLE的,問題的‘G’只求隊列中的最大值,可以使用單調隊列這個數據結構來維護隊列中的最大值Code:#include #include #include #include #include #include #include #include #include #include #include #include #include u
2013-05-10 12:23:49
495
原创 uva_11795_Mega Man's Mission( 簡單狀壓DP )
題意:略分析:略,注意精度#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define REPI(i, s, e) for(i
2013-05-08 19:58:06
580
原创 la_4727 Jump ( 经典模型变形 )
題意:略分析:如果使用單純模擬的話,時間複雜度會比較大這裡運用了DP的思想,如果知道1 到 n-1個人和k,最後退出的人的序號,那麼通過這個序號可以推算出1到n個人k的最後推出的人的序號還不懂的建議自己去磨一下.Code:#include #include #include using namespace std;const int MAXN = 500000
2013-05-08 16:41:44
600
原创 uva_11552_Fewest Flops( 经典DP模型 )
題意:略分析:狀態:f[i][ch],前i組以ch結尾所得的最小cnt狀態轉移:f[i][ch] = min(f[i][ch], f[i-1][chp]+cost(i, chp, ch)),其中cost(i, chp, ch)表示第i組變成目標的花費Code:#include #include #include #include #include #include
2013-05-07 21:25:31
733
原创 uva_10534_Wavio Sequence( LIS )
题意:略分析:經典LIS問題,時間複雜度可以為o(nlogn),至於O(n^2)是否可行,沒有試過Code:#include #include #include #include #include using namespace std;#define REPI(i, s, e) for(int i = (s); i <= (e); i ++)#define
2013-05-07 11:10:02
483
原创 uva_11584_Partitioning by Palindromes( DP )
題意:給你一個字符串,讓你去劃分該字符串,目標使得劃分出最小的回文串分析:一開始考慮是個區間DP,想都不想就寫了交上去,結果是TLE,後來發現數據量是10^3,區間DP的時間複雜度高達O(n^3),TLE是正常的正解:f[i]表示字符串底i個字符的時候,所能劃分的最小回文串的數量f[i] = min(f[i], f[j]+cost(j+1,i)).Code;#inc
2013-05-06 20:30:41
421
原创 uva_10167_Birthday Cake( 窮舉+卡精度 )
題意:給你一系列的點,讓你找出一條直線AX+BY=0, 使得直線把這些點劃分爲兩個部分分析:由於題目給出的AB範圍小且爲整數,直接暴力可以過,不過這裏要注意精度問題,判斷是否在直線上不能直接與zero比較Code:#include #include #include #include #include #include #include #include #in
2013-05-03 21:39:02
432
原创 fzu_2120_數字排列(狀態壓縮DP)
題意:略分析:這個應該可以暴力,具體沒有嘗試,不過看submit有400多ms的估計就是使用暴力的,對於這個題目我是使用狀態壓縮的方法解決的把已經選擇了的數字看成一個集合狀態:f[s][tail_idx] 表示選擇的集合爲s且放在最後一個數字的映射爲tail_idx的最小cost.狀態轉移: f[s][tail_idx] = min(f[s-s0][k] + cost[n[
2013-04-30 10:55:22
564
原创 uva_10125_Sumsets( 二分 )
題意:給你一個整數集合,要求你從中找出一個最大的d,使得a+b+c=d,其中a,b,c,d都是集合s中的不同元素分析:如果暴力的話O(N^4),但是可以使用二分解決,就是美劇a+b後對其結果排序,接着枚舉d-c如果二分查找a+b的結果中存在a+b = d-c,那麼這個d就是一個解時間複雜度O(N^2*log(N*N))Code:#include #include #in
2013-04-26 15:41:14
453
原创 uva_10827_Maximum sum on a torus( 普通DP )
題目:最大子矩陣,只不過行和列都可以向外延伸分析:簡單的DP,略Code:#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#
2013-04-26 13:03:27
450
原创 uva_11627_Slalom( 二分 )
題意:題目意思比較就是有n個障礙你必須通過,障礙的左面的座標已經給出,障礙的縱座標單調遞增,你有s個鞋子,每個鞋子的垂直速度是sj, 且你的水平速度不能大於vh,問最快通過所有障礙的鞋子的最大速度是多少?分析:由於橫速度恒定,二分枚舉速度。只要將當前障礙到下一個障礙之間的距離分解,然後求出下一個橫區間的範圍,然後判斷這個區間是否為合法區間就得出這個速度是否可行Code:#inc
2013-04-24 15:15:26
431
原创 uva_10905_Children's Game( 貪心好題 )
題意:給定n個正整數,你的任務就是把他們連接成一個最大的整數分析:排序後直接輸出是不行的,反例:13, 1312如果兩個數字的位數相等,那麼可以直接判斷,如果不等的話,對於某個數字要麼在前,要麼在後,枚舉這兩種情況就可以了Code:#include #include #include #include #include #include #include #include
2013-04-23 15:48:31
404
原创 uva_10382_Watering Grass( 貪心 )
題意:噴水裝置能否覆蓋草坪,其實隻取決於圖中每個圓藍色部分能否將草坪覆蓋,這樣我們就將問題轉化成了有若幹線段,求覆蓋一個指定區間最少要多少條線段分析:題目可以作出如下轉化:從最左開始使用貪心策略每次選擇一個包含當前最右的區間且擴張最遠的圓Code:#include #include #include #include using namespace st
2013-04-23 14:13:20
434
原创 LA_3602 DNA Consensus String ( hash, 貪心 )
題意:給定m個長度爲n的DNA序列,求一個DNA序列到所有DNA序列的Hamming距離最小,兩個字符串的Hamming距離定義爲:字符不同的位置數分析:統計每一列的ACGT的數量,取最多的爲rst,然後統計Hamming距離Code:#include #include #include #include #include #include #include #includ
2013-04-22 21:12:01
524
原创 LA_3213 Ancient Cipher( 排序,hash )
题意:一對字符串各有n個大寫字母,如果能組合出一個映射表的話則输出YES,否則NO.分析:簡單題,可以先對組字符串每個字符出現次數進行統計,然後排序,接着比較,時間複雜度O(n).Code:#include #include #include #include #include #include #include #include #include #include
2013-04-22 20:49:33
487
原创 uva_11039 - Building designing( 基數排序 )
題意:有n個絕對值不同的整數(非0),選出儘量多的數,排列成一個序列,正負相間且元素絕對值遞增,求最長的序列的長度.分析:可以先存下來接着使用nlogn的排序也可,這裏用了hash的基數排序Code:#include #include #include #include #include #include #include #include #include #incl
2013-04-22 20:36:24
456
原创 LA_4794 Sharing Chocolate( 狀態壓縮DP )
題意:給你一塊n*m面積的矩形,每次只切割只能橫着切或者是豎着切,問能不能切割成指定的面積的集合分析:如果使用沒有優化的DP,比較容易想到如下:狀態:f[r][c][S],表示面積爲r*c的矩形能否切割成面積的集合S狀態轉移: f[r][c][S] = 1, 當且緊當:f[r0][c][SR0] = f[r-r0][c][S^SR0] = 1 or f[r][c0][SC0] = f[r
2013-04-22 16:17:10
642
原创 LA_3983 Robotruck( 單調DP )
題意:一個機器人,收拾垃圾,收拾垃圾必須按照順序(性質很明顯),收拾完垃圾必須回到原點,兩點之間的距離是哈曼噸距離分析:很容易想出狀態O(N*M)的DP算法可惜狀態個數太多了,不得不這樣想:f[i]表示機器人收拾完第i個垃圾並且回到了原點所需要的最小距離這裏令ori[j] 表示第j個垃圾到原點的距離dis[i], 垃圾1,2,3,... i的距離不難推出狀態轉移: f[i] = mi
2013-04-16 20:35:36
454
原创 uva_10859_Placing Lampposts( 樹形DP )
題意:在一個n個節點,m條邊的無向無環圖中的節點中放置街燈,一個結點放置街燈那麼與這個結點爲頂點的邊都被照亮,使得每條邊都有被照亮的最少放置街燈的前提下,使得被兩個街燈照亮的邊儘量的多分析:在這裏的被兩個燈照亮的邊儘量的多,變一下:使得被一個燈照亮的邊儘量少無向無環圖也就是森林, 對於求兩個變量的最小設一個等式: x = aM+c, 其中a是需要最少的燈,c是一個燈照亮的邊數量,目標就是使
2013-04-15 20:07:46
395
原创 uva_100 The 3n + 1 problem( DP )
題意:經典問題。分析:如果直接算,估計要TLE了,其實對於求n的循環長度,如果n是奇數那麼只需要知道3*n+1的循環長度,如果n是偶數那麼只需要知道n/2的循環長度,容易想到的是分治+記憶化Code:#include #include #include #include #include #include #include #include #include #incl
2013-04-15 14:38:06
506
原创 uva_900 - Brick Wall Patterns( 遞推 )
題意:給你無限個1*2的矩形,求能組成多少個以n爲底的矩形的不同形狀的矩形分析:因爲增加的矩形爲1*2,所以假設要求當前的以n爲底的矩形,那只能從n-2的個數上增加一個1*2的矩形 + 從n-1的個數上增加一個2*1的矩形,忽略重複的因爲這個不影響最終結果,自己想想吧即:f[n] = f[n-1]+f[n-2].Code:#include #include #include #i
2013-04-15 10:43:03
520
原创 uva_11069_A Graph Problem( DP )
題意:簡單明遼,略。分析:狀態:f[i][j]表示序列i到j的最大集和數量狀態轉移:f[i][j] 那麼有兩種選擇:1.選擇第i個,那麼第i+1個就不能選擇,這就跟f[i+2]有關了2.選擇第i+1個,那麼第i個和第i+1個都不能選擇,這就跟f[i+3]有關Code:#include #include #include #include #include #include
2013-04-15 08:46:05
462
原创 uva_11825_Hackers' Crackdown (狀態壓縮DP,好題)
分析:這個題目的數學模型是,把集合p1, p2, p3, ..., pn分儘量多組,使得每組的並集等於S全集,其中pi表示i於i相鄰的頂點組成的集合,每組等於一個服務把一個集合表示二進制的形式,狀態f[i]表示i所表示的集合最多分成多少組f[i] = max(f[j]| j的並集等於S)+1Code:#include #include #include #include #inc
2013-04-13 21:59:43
403
原创 uva_10635_Prince and Princess ( LIS )
分析:如果使用LCS的DP算法,時間複雜度O(n*m),可惜這裏的n高達250*250,時間不允許的,題目說明了一個序列中的元素唯一,所以可以將序列A離散化,然後序列B中的元素如果A中存在相同的可以mark下來,如果不存在直接刪除,這樣可以轉換成LIS,時間複雜度O(nlogn).Code:#include #include #include #include #include #
2013-04-13 12:37:08
568
4
原创 LA_2965 Jurassic Remains
題意:給定n個大寫字母組成的字符串,選擇儘量多的串,使得每個大寫字母都能出現偶數次分析:不難想出枚舉每個字符串選擇與否的暴力算法可惜運算量高達2^24由於字符串只考慮每個字母的奇偶情況,用0表示字符出現的次數爲偶數,1表示出現的次數爲基數,可以使用stl中的map建立前n/2個字符串所有情況的映射,然後枚舉後n個的時候可以從映射中二分查找Code:#include #include
2013-04-12 14:35:36
453
原创 hdu_3299_Distant Galaxy( DP )
題意:n個座標,要求找一個矩形使得儘量多的座標在矩形的邊界上分析:考慮最優的情況,如果n多於4,那麼每條邊必然最少有一個頂點,證明略,如果枚舉每條邊界所穿過的頂點,時間複雜度O(N^5),不用說TLE,如果換個角度想,如果只要枚舉y座標的上下界,然後使用統計當前上下界情況下的最大滿足情況的話,難點就是統計記l[i] :表示第i列之前的存在於邊界上的頂點的個數(不包括第i列的)記on1
2013-04-12 10:48:24
457
原创 LA_3029 City Game( DP )
題意:一個由'R'和'F'組成的m*n的矩陣,求全部F的子矩陣最大,輸出結果*3.分析:比較容易想到的是枚舉每個矩陣的左上和右下的頂點然後統計,這樣的時間複雜度O(N^4)太慢了,其實可以把從i行到矩陣第一行看成一個一維數組,其中裏面的數字表示的就是這一列的高度,記up[i],表示第i列在第i行的高度,up的維護比較簡單,如果當前元素是'R'則up[i] = 0, 否則up[i] += 1,
2013-04-11 21:53:07
486
原创 LA_2678 - Subsequence( 二分 )
題意:一個序列S,其中的元素全部都是正整數,求最短連續的子序列,使得其和小於等於s分析:由於全部元素是正整數,設f[i]爲前i個的和,那麼f是遞增的f[j]-s >= f[i],其中i越大連續序列的長度越小,所以這裏可以使用二分求出i,時間複雜度O(nlogn).Code:#include #include #include #include using namespace s
2013-04-11 20:27:07
427
原创 LA_3902 - Network
題意:一個樹狀網絡,指定一個服務器s,一個距離k,與服務器相距爲k的節點都能被服務到,問服務整個網絡最少要增加多少臺服務器分析:這個網絡是無向的,轉成有向的比較好處理,題目給定了一個服務器,可以以這個點爲Root,把這個樹狀網絡變爲有向,然而比較優先的策略是從深度最深的葉子節點開始算距離爲k的位置放置一個服務器,然後更新覆蓋點,這裏只需要處理葉子節點,爲什麼? 因爲,如果葉子節點能被覆蓋的話
2013-04-11 19:24:27
401
原创 LA_3635/HDU_2333 Assemble (二分)
題意:讓你去購買不同總類的配件個一個,配件總數爲n,購買的配件總價格不能超過b,且使得所購買的配件中的質量係數中最小的最大分析:最小最大的問題,二分枚舉能不能構成不小於k的質量係數,若能構成則ans >= k,否則ans < k.Code:#include #include #include #include #include using namespace std;#de
2013-04-11 16:59:03
434
原创 uva_11549_Calculator Conundrum( 模擬 )
題意:一個計數器計算一個數的平方,只能顯示答案的前N位,給定開始的數K和N,最終會落入循環,問其中得到的最大數值是多少分析:簡單的模擬題,但是存在一種比較巧妙的方法,可以把這個循環看成兩個人在賽跑,如果速度慢的人‘超過’了速度快的人,那麼可以看成進入了還Code:#include #include #include using namespace std;#define INF
2013-04-10 20:36:13
399
原创 uva_11078_Open Credit System(DP)
題意:給你一個長度爲N個整數序列,要求找出Ai,Aj使得(i<j), Ai-Aj最大分析:這個和最大子段和相似,這裏使用O(N)的DP解法狀態:m[i]表示從[i-1, n]的最小數值狀態轉移:m[i] = min(m[i], f[i])ans = max(f[i]-min[i])注意更新順序Code:#include #include #include using nam
2013-04-10 20:06:46
557
原创 uva_11462_Age Sort(sort)
題意:給你N個數字,每個數字範圍「1,100」, 要求你按照升序輸出它們分析:不難想到排序,但是這裏的N比較大,再加上測試數據比較多,即使是O(nlogn)的排序在uva上表現不是很理想比較理想的算法是基數排序時間複雜度O(n), 而且這裏的年齡範圍最大的只有100,這樣的數組可以開出Code:#include #include #include using namespace
2013-04-10 19:43:09
414
原创 hdu_1969_NWERC2006_Pie(二分)
題意:F+1個人平分N個圓,第i個圓的半徑爲ri,使得每個人得到的面積相等且使得分到的面積儘量的大,每個人得到的部分不必是一個完整的圓形分析:初看這個題目以爲是一個數學題,二分可以說是比較完美的解決這個題目了二分枚舉分到的面積area,判斷則是對每個圓可以切割出多少個這樣的面積,所有圓可以切割的分數如果多於F+1個人,那麼當前面積可以切分,使用二分逼近最終得到結果,需要注意的是,二分的時
2013-04-10 19:25:22
491
原创 uva_10795_A Different Task(分治)
題意:漢諾塔,給定開始局面和結束局面,問從參考局面最小需要移動多少步才能到結束局面分析:1.從最大的底盤開始考慮,如果最大的底盤在始態和終態中相同,那麼可以不考慮移動該底盤了,如果移動了該底盤那麼操作就不是最優的了2.從最大的一個不相同的底盤K開始考慮,假設開始K在A柱上,終止在C柱上,那麼K-1必須在B柱上,才能使得K從A->C,這時候假設這個局面爲中介局面使用函數表示成:f(arr,
2013-04-09 21:57:46
457
原创 uva_11384_Help is needed for Dexter(貪心)
題意:給你一個序列S = {1, 2, 3, ..., n}, 每次可以從中選擇一些元素刪除特定的數字,當然所刪除的數字必須小於等於取出來的元素,最後使得S = {0},的最小刪除次數分析:不難想出一個DP方法:設狀態f[1,2,3...,n]爲所求當 n = 1 時,f[1] = 1.當 n = 2 時,f[1,2] = max(f[1])+1當 n = 3 時,f[1,2,3] =
2013-04-09 20:59:23
467
原创 uva_11464_Even Parity(枚舉,暴力)
題意:給你一個n*n的0,1矩陣,要求你操作最少的0邊成1,1不能變,使得n*n的矩陣變成偶數矩陣,也就是任意的一個矩陣內的元素,其上,下,左,右元素(如果存在的話)的和位偶數分析:最簡單的想法就是暴力想法,也就是枚舉每個0,變或不變,其運算量極大,在本題目的承受範圍內不能理想的運行出結果其實確定了第一行就可以確定第二行了,爲什麼?自己好好想想,不難如果這樣想的話,只需要枚舉一行的所有情
2013-04-09 20:48:05
504
linux 版神舟数码客户端(官方没有个人写的)
2012-11-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人