Time of Update: 2018-12-05
//DFS回溯,其實就是24點遊戲的問題//沒想到那麼蛋疼,居然卡了我很久,顯然的深搜題//回溯思路是這樣的,5個數,先任意找2個數進行加減乘除,把這2個數運算後的結果當做一個數,按相同的方法搜下去//把4個數任取2個然後合并成3個,再繼續搜下去//搜尋樹的深度為5,
Time of Update: 2018-12-05
//dfs染色+二分答案#include<cstdio>#include<iostream>#include<cstring>#include<vector>using namespace std;const double MAX = 400;struct coord{double x,y;}P[15];double calDis(coord a,coord b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-
Time of Update: 2018-12-05
//最小費用流//構圖關鍵是添加超級源點,超級匯點//題意是要找一條可以再終點往返的路,這2條路距離之和最短且每條路只能經過一次//第一步將問題轉化為找2條從起點到終點//第二步與費用流掛鈎,將距離當做費用,將容量設定為1是為了保證每條路只經過一次//超級源點和起點的容量為2,終點和超級匯點容量為2,使得最多找2條路//最終的mincost即為答案//注意雙向邊這個條件,當出現雙向邊或多重邊時,就得用鄰接表儲存了#include<iostream>#include<queue&
Time of Update: 2018-12-05
//Floyd +
Time of Update: 2018-12-05
//TREAP求第K小數//感謝JSH大牛的指點//這道題之所以可以用TREAP做是因為題意中有個條件,詢問區間不會出現包含的情況,因此通過對詢問區間進行排序//然後通過插入和刪除的方法,來維護區間的第K小//平衡樹的話自然首選TREAP了,TREAP中比較難的就在於刪除那裡,刪除的方式是通過將要刪除的結點通過左右旋的方式,在維護LEV為堆的同時,將要刪除結點旋到葉子結點處,然後刪除#include<iostream>#include<cstdio>#include<
Time of Update: 2018-12-05
//類比題,理解題意比較辛苦//說的是在一個電路中,找到滿足條件的電阻,使得LED能夠發光且不超過LED管的額定電壓//用MAP對電阻值和名稱進行關聯//排個序,找到大於等於最優解的值就行了#include<iostream>#include<algorithm>#include<map>#include<vector>#include<string>using namespace std;int
Time of Update: 2018-12-05
//傳遞閉包的建立(Floyd) + 最小路徑覆蓋//這題有別於1422,原因在於它是一個有向圖,而非DAG,機器人可以繞一圈回來在走其他路//the roads of two different robots may contain some same
Time of Update: 2018-12-05
//傳遞閉包//看了郭老的書才懂得傳遞閉包的建立//T為傳遞閉包數組//在6中運算關係中,可以簡化為<,<=,!= 3中//a>b ---> b<a//a>=b ---> b<=a//a=b ---> a<=b && b<=a//不等號關係的判斷需要另外加入//為了操作方便,用二進位位壓縮來表示變數之間的關係//T[a][b] = 1 (二進位為01)表示a <= b//T[a][b]
Time of Update: 2018-12-05
//要按字典序輸出,所以要注意搜尋順序//最後一行不能留空行//唉,搜都要寫這麼久,還WA了那麼多次,太弱了我#include<iostream>using namespace std;int Case,X,Y;bool vis[50][50],ok;int dir[8][2] = {-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2};int path[30][2];bool legal(int x,int y){if(x < 1 || x
Time of Update: 2018-12-05
//單源最短路徑//Dijkstra + 優先隊列實現#include<iostream>#include<queue>#include<cstring>#define INF 1200000000#define MAXN 205#define MAXM 20005using namespace std;typedef pair<int,int> dis_v;//用一個pair類型存放當前結點的距離和結點編號int T,N,M;int
Time of Update: 2018-12-05
//驗證哥德巴哈猜想,結論必然正確……故不必要檢測錯誤情況//用篩選法打表//如果i是素數,n-i也是素數,則這兩個數就是分解的結果//複雜度必須O(n)才能過,O(n^2)必定TLE#include<iostream>#include<cstring>using namespace std;const int MAXP = 10000010;bool isPrime[MAXP];int prime[MAXP];void
Time of Update: 2018-12-05
//字串處理//很奇怪的一道題,關鍵是對結束的判斷和空行的檢查//用STL可以省很多事情#include <iostream>#include <string>#include <algorithm>using namespace std;string s1,s2;bool checkEmpty(string str)//檢查這一行是不是空行{for(int i = 0;i < str.size();++i)if(str[i] > '
Time of Update: 2018-12-05
//這次是驗證哥德巴哈猜想的解有多少個,同樣核心是打素數表//思路和POJ 2262差不多,篩法打素表#include<iostream>using namespace std;const int MAXP = 400000;bool isPrime[MAXP];int prime[MAXP];void primeList(){memset(isPrime,true,sizeof(isPrime));for(int i = 2;i <=
Time of Update: 2018-12-05
//線段樹//WA了很多次,最後查出原因居然是建樹的時候初始化有最大糖果的下標錯了//我只有在葉子節點有初始化,其他點沒有,所以錯了,正確初始化應該是每個區間最左邊的點為maxid//線段樹插入和修改的inherit和update函數是關鍵,直到這道題總算摸索出套路了//建樹什麼都差不多,關鍵就看如何識別標記,如何處理區間與區間之間關係,如何回溯傳遞結果#include<iostream>#define MAX 100005using namespace std;struct
Time of Update: 2018-12-05
//搜尋題,王用寬搜解決,後用點和點的斜率解決,只有兩種情況,要麼1,要麼2。//車直線判斷即可,要麼1,要麼2。//象斜率判斷加所在格子的黑白情況進行判斷,我想出了一個好方法。行列同奇同偶,為白色,行列奇偶互異為黑色。//象如果在黑色格子上,他永遠到不了白色格子,這是性質。#include<iostream>#include<queue>using namespace std;bool vis[64];int dir[8][2] = {-1,-1,-1,0,-1,1,0
Time of Update: 2018-12-05
//簡單題。篩選法打素數表。#include<iostream>using namespace std;const int MAXP = 1100000;bool isPrime[MAXP];int prime[MAXP];void primeList(){memset(isPrime,true,sizeof(isPrime));isPrime[1] = false;for(int i = 2;i <=
Time of Update: 2018-12-05
//Floyd + 狀態壓縮DP//題意是有N個城市(1~N)和一個PIZZA店(0),要求一條迴路,從0出發,又回到0,而且距離最短//也就是TSP(旅行商)問題,首先不難想到用FLOYD先求出任意2點的距離dis[i][j]//接著枚舉所有狀態,用11位二進位表示10個城市和pizza店,1表示經過,0表示沒有經過//定義狀態DP(S,i)表示在S狀態下,到達城市I的最優值//接著狀態轉移方程:DP(S,i) = min{DP(S^(1<<i-1),k) + dis[k][j],
Time of Update: 2018-12-05
#include<iostream>#include<vector>using namespace std;typedef int State[9];const int MAXS = 1000003;State st[MAXS],goal = {1,2,3,4,5,6,7,8,0};int dir[4][2] = {-1,0,1,0,0,-1,0,1};int
Time of Update: 2018-12-05
//經典的深度優先搜尋,必須剪枝才能通過,而且剪枝策略十分神奇,先走下一步可行拓展數最少的,看了大牛的題解才會的//也就是說假如當前結點有8個可以走的拓展點,對每個可行拓展點再計算它的可行拓展數,然後排序,先走那個可行拓展數最小的//就是先走那個最沒前途的點,這樣會更快,因為它這麼沒前途,要從其它點到達它就更難了,所以先走#include<iostream>#include<cstring>#include<vector>#include<algorit
Time of Update: 2018-12-05
//BFS倒水問題,對於需要列印解得廣搜題,必須儲存搜尋狀態和狀態的父親指標,然後逆推,根據狀態和狀態之間的關係//判斷屬於那一種情況,並將解記錄,還有POJ的1606也是同樣類型的題,只不過要求有點點不一樣,規模也有點點不一樣//代碼也就不重複貼了~#include<iostream>#include<queue>#include<vector>#include<string>using namespace std;bool vis[105][1