Time of Update: 2018-12-05
根據羅的論文,兩個串的中間要加一個ascii碼比任何字母都小的字元最長公用子串(pku2774,ural1517)給定兩個字串A 和B,求最長公用子串。演算法分析:字串的任何一個子串都是這個字串的某個尾碼的首碼。求A 和B 的最長公用子串等價於求A 的尾碼和B 的尾碼的最長公用首碼的最大值。如果枚舉A和B 的所有的尾碼,那麼這樣做顯然效率低下。由於要計算A 的尾碼和B
Time of Update: 2018-12-05
dp求期望double dp[1024][111];//dp[i][j]第i round到j格的機率bool stop[111];int go[111];int n;int main(){ while(scanf("%d",&n) !=-1){ int i,j; int m; memset(go,0,sizeof(go)); memset(stop,0,sizeof(stop));
Time of Update: 2018-12-05
題意:一對新婚的夫婦邀請(n-1)對夫婦來參加自己的宴會,這對新人以及這些受邀請的夫婦都坐在長桌子的兩邊,新娘和新郎分別坐在桌子的兩側,新娘不希望看到她邀請來的那些夫婦之中有妻子和丈夫坐在同一邊的情況(即妻子和丈夫要分作桌子的兩邊),在這n對夫婦中有一些男女存在著曖昧的關係,所以新娘也不希望看到有曖昧關係的人坐在她對面的那一側.求解是否存在一種滿足新娘要求的座位分配方案,如果存在的話,那麼就輸出這方案,否則輸出"bad luck".
Time of Update: 2018-12-05
這題讀起來有點蛋疼,真是英語害死人!題意是有n個點在圓的邊緣,編號是0~n-1順時針,有m條線(不一定是直線,線可以再圓內,也可以再圓外),問是否存在所有線不想交的情況方法:2-SAT,以所有線為點,兩兩枚舉,假設i代表在圓內,i'代表圓外,如果線i與線j在圓內相交,就連i---j'還有j---i',注意要連雙向邊,然後就套模板,如果兩個矛盾點在同一個強連通分量裡就false。#define N 1111vector<int> v[N];stack<int>
Time of Update: 2018-12-05
題意是說,2N把鑰匙,M個門,每個門有兩個鎖,開其中一個就可以,把2N把鑰匙分成Npair,用了其中一把,另一把就不再出現,而用的那把可以迴圈使用,問最多能開多少扇門?解法:2-SAT+二分因為開門是有序的,所以二分答案。設有4N把鎖,其中1~2N表示鎖i(1<=i<=2N)使用,2N+1~4N表示鎖j(1<=j<=2N)拋棄,接著就是激動人心的建圖!先建不能共存的鎖,再對門進行建圖。最後就縮點#include <vector>#include
Time of Update: 2018-12-05
這題debug的好鬱悶啊!!!先是染色有問題,然後就是各種小錯誤....判奇圈可以用二分表徵圖准,因為奇圈肯定不是二分圖,之前還要分離各雙連通分量.......染色法判二分圖一定要先對分量裡每一個點都染一次色再枚舉任意兩個相鄰的點看是否有同色,就是因為這裡wa了n次!!!#define N 1005vector<int> v[N];vector<int> lin[N];int dfn[N],low[N];bool instack[N],iscut[N];int
Time of Update: 2018-12-05
#include <vector>#include <list>#include <map>#include <set>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric&
Time of Update: 2018-12-05
http://poj.org/problem?id=2751貪心策略見cmp函數,簡單來說就是使得s1的作業及你快完成,以便儘快轉到s2,注意s1沒有空閑時間,而s2可能有空閑時間#define N 10005struct node{ int s1,s2;}p[N];/*bool cmp(node a,node b){ if(a.s1!=b.s1)return a.s1<b.s1; return a.s2>b.s2;}*/bool cmp(node x,node
Time of Update: 2018-12-05
題意是說,一個牧師要幫人舉辦婚禮慶典,給出每對新人的可用時間段s,e和舉辦慶典時間長度len,這個慶典只能在時間段前或時間段後舉行並且這些時間段不能有衝突,問牧師能否為他們舉辦慶典,能就輸出具體時間段。解法:2-SATi表示甲婚禮前段,^i表示甲婚禮後段j表示乙婚禮前段,^j表示乙婚禮後段建圖:i與j有衝突,i-->^j,j-->^ii與^j有衝突,i-->j,^j-->^i^i與j有衝突,^i-->^j,j-->i^i與^j有衝突,^i-->j,^j-
Time of Update: 2018-12-05
這裡首先複習一下什麼叫“簡單圖”(其實是自己忘記了==!).......一個圖如果不含重邊或環則稱為簡單圖。1 、Havel 定理:把度排序,從大到小,類似拓撲排序,只是把過程反過來而已。具體過程:貪心的方法是每次把頂點按度大小從大到小排序,取出度最大的點 Vi,依次和度較大 的那些頂點 Vj 串連,同時減去 Vj 的度。串連完之後就不再考慮 Vi 了,剩下的點再次排 序然後找度最大的去串連……這樣就可以構造出一個可行解。 判斷無解有兩個地方,若某次選出的 Vi
Time of Update: 2018-12-05
因為第一次接觸字典樹,所以參考了別人的代碼,在這裡要感謝http://hi.baidu.com/sulipol/blog/item/741f7c11c8bcfa0c203f2e4f.html該blog的博主,發表這麼一篇通俗易懂的代碼,讓我明白字典樹是怎麼一回事!這題是給出n個單詞,有m個詢問,注意,這些詢問可以是單詞的子序列,所以建樹的時候要去重,具體怎樣去重呢?就是先把第一個單詞的各個子序列建立一棵字典樹,建樹的時候要標記當前的id,就是第幾個單詞,相同的跳過,例如有單詞abab,其中ab,
Time of Update: 2018-12-05
http://poj.org/problem?id=3895技巧是標記每個節點的步數和是否訪問過#include <vector>#include <list>#include <map>#include <set>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>
Time of Update: 2018-12-05
先對從左至右對每一行進行dp,再類似地從上到下dp,兩次dp!#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string>#include <deque>#include <stack>#include <algorithm>#include
Time of Update: 2018-12-05
http://acm.hust.edu.cn/thx/problem.php?id=1428#include<iostream>#include<cstdio>#include<string.h>#include<vector>#include<map>#include<cmath>#include<stack>#include<queue>#include<algorithm>using
Time of Update: 2018-12-05
http://poj.org/problem?id=2762題目給出n個點m條單向邊,問是否存在取任意兩點x,y,使得可以x->y或y->x,其實就是求弱連通分量....方法:縮點+拓撲。因為環內各點肯定可以任意到達,縮完點後就可能變成樹或森林,當樹是一條鏈的時候才存在弱連通分量,拓撲一下就ok...一開始看不到The cave has n rooms, andone-waycorridors connecting some
Time of Update: 2018-12-05
AB水題。C貪心構造。分情況討論:1、a == 0或b != 0 ,先處理b個的情況,可以利用2的冪次來構造,因為例如1,2,4,8,16......2的冪次序列滿足後一個總大於前面所有值之和,可以化成二進位驗證,在處理a2、a != 0&& b==0,如果a==n-1&&b==0很明顯矛盾;否則就先處理a,再處理b,前面要有兩個1保證a情況int main(){ int n,a,b; while(scanf("%d%d%d",&n,&
Time of Update: 2018-12-05
http://acm.hdu.edu.cn/showproblem.php?pid=3572題意:給出n個任務+m台機器,還有一個任務處理時限+開始時間+結束時間,一個時刻裡一台機器只能處理一個任務,但是一個任務可以在不同機器處理,問能否處理完所有任務?方法:最大流。這個題的建圖算是經典,因為限定每個時刻每台機器只能處理一個任務,所以可以把時間點分配給各個合法的機器...具體是先設定一個超級源點S,連向各個任務,容量為該任務所需時間,各個任務連向在範圍內的時間點,容量為1(保證每個時刻xxx這個
Time of Update: 2018-12-05
思路參考了這個bloghttp://hi.baidu.com/aekdycoin/blog/item/7abf85026f0d7e85d43f7cfe.html複雜度是O(nlgn)#define N 100005struct node{ double x,y;}a[100005];double cross(node a,node b,node c){//>0,ab在ac順時針;<0,ab在ac逆時針 return (b.x-a.x)*(c.y-a.y) -
Time of Update: 2018-12-05
黑書例題#define eps 1e-9#define pi acos(-1.0)struct Point{ double x,y;};int dbl_cmp(double d){ if (fabs(d)<eps) return 0; return d>0?1:-1;}double det(double x1,double y1,double x2,double y2){ return x1*y2-x2*y1;}double
Time of Update: 2018-12-05
用到了鴿籠原理的結論:設可選的 N 個數從小到大依次為 a(1)、 a(2) … a(N),則在最優的取法中,小於 a(N) 的數不會多於 a(N) 個。#define N 10005int dp[N];int w[111];int main(){ int t; scanf("%d",&t); while(t--){ int n,c; scanf("%d%d",&n,&c); int i,j;