Time of Update: 2018-12-05
這是一道二分匹配的副產品題目,題目: N*N的矩陣,每個個格子裡面有一個數,w[i][j], 給每一行和每一列分別賦給一個值,使得對於任意格子都有,w[i][j] <= row[i] + col[j];要求輸出row和col,以及它們的總和的最小值由於KM演算法結束後,所有頂標之和就是最小的,這道題沒有求最小匹配的值,而是求的可行頂標的值代碼如下:#include <cstdio>#include <algorithm>using namespace
Time of Update: 2018-12-05
還是KMP,只不過這次要返回的不是第一個出現位置,而是出現了多少次,原理相同,只是找到了之後不再返回,繼續找。不過有一點要注意,word在text中可能重疊,所以當找到了一個字串的時候,下一次再找,並不是從當前的text的位置開始和word的第一個字元進行比較!代碼:#include <cstdio>#include <cstring>const int N = 1000001;const int M = 10001;int t;char W[M], T[N];int
Time of Update: 2018-12-05
只有一組輸入,每行三個資料,第一是指令,第二個是事件編號,第三個是這個事件發生的周期, 以“#”結束;然後輸入k輸出前k個發生的事件,如果同時發生,標號小的先輸出代碼:#include <cstdio>#include <cstring>#include <queue>using namespace std;struct item{ int qnum, per, time; bool operator < ( const item&
Time of Update: 2018-12-05
要解決這道題,首先要理解KMP中的next數組,現在覺得這個next數組真的很重要啊!!!要找到一個字串的所有的既是首碼又是尾碼的子串的長度,那麼就要知道,next指標的的含義,指向最長既是首碼又是尾碼的首碼位置的後一位,那麼一個對於一個位置的next的指標的位置的next指標指向的位置,於當前位置來說是什麼意義呢?其實就是一個當前位置為止,既是首碼又是尾碼的首碼的後一位,只不過不再是最長的了。那麼明白這個原理,就可以求一個字串所有的既是首碼也是尾碼的子串了以及它們各自長度。代碼如下:#incl
Time of Update: 2018-12-05
這道題開始理解得有偏差,這裡再說明一下題目是給出一組數字,每兩個相加之後,把數字刪掉,然後把這兩個數的和加到這寫數字裡面例如: 1 4 6 8 9 這5個數,如果1+8=9,那麼數列變成 4 6 9 9,1和8被刪掉,9加進來。而且,每次相加,都要付相應費用,費用就是兩個數的和,比如1+8費用就是9問題是:求將所有的數都加起來,最小費用是多少那麼用貪心的思想,要想費用最小,就要每次的費用都最小,那麼就是每次在數列裡面找兩個最小數相加,這樣費用才能最小那麼找最小的兩個數,每次都排序,一定很費時,
Time of Update: 2018-12-05
這道題,要注意,寫網路流的時候,最好最好不要破壞原來的矩陣,尤其是需要多次求一個圖的最大流的時候。這道題,是求一個圖的最小割點數。開始以為有專門的演算法可以用呢,不過沒有找到,然後想拆點求最小割,但是不知道無向圖應該怎麼建,如果正常拆點的話,拆出來的圖還是一個有向圖,SW只是解決無向圖的情況,很糾結!要是哪位大牛路過知道有更好的演算法的話,跪求指點!這道題的做法就是,拆點,將每個點拆為入點和出點,入點和出點之間流量為1,其他點之間流量為INF,同時要注意的是,源點和匯點是不能被刪掉的,所以,當你
Time of Update: 2018-12-05
這道題,也是字串匹配的問題,資料不大,估計暴力也可以,用時間要求是1000MS,KMP演算法15MS過的!給力!然後唯一不同的是,在模式串中不算有重疊的匹配串,只算一共有多少個不重疊的就好。要想最多,那很好辦,只要從頭挨著剪,就不會破壞其他的,比如aaaa,aa只要是從剪,就能剪出兩個,要是從中間開始,只能剪出一個。因此……見代碼:#include <cstdio>#include <cstring>const int N = 1010;char str[N], s[N]
Time of Update: 2018-12-05
//有點鬱悶深搜過來, 廣搜沒過,求大神指點啊#include <stdio.h>#include <stdlib.h>#include <string.h>int n;struct node{int num;struct node * next; };struct data{int prior;node * last_linked;}map[100000];node q[20000];int front, rear; void del( ) {
Time of Update: 2018-12-05
這道題是並查集的應用,很好的題型思路我也是參照別人的思路,不過思路很簡單的題中說了很多很複雜的關於朋友還是敵人的東西,其實你讀透了就會發現,其實就是一句話,如果你是我的朋友的朋友,那麼我們就有公用的敵人也就是說這個朋友圈的人,
Time of Update: 2018-12-05
這是一道建圖的題,只要能想清楚怎麼建圖,就沒有問題建圖:Bob和所有粘貼相連,邊的容量是他所擁有粘貼的個數; 其他人和他們所擁有的粘貼相連,邊容量為手中物品個數減1,因為他們要保留一個 其他人沒有的粘貼,從粘貼連到這個人,容量為1,他只能接受一個這種粘貼 每種粘貼和匯點相連,容量為1代碼如下:#include <cstdio>#include <cstring>#include <queue>#
Time of Update: 2018-12-05
開始沒有注意每個regulator都有一個限制,wa了改的時候也沒有反應過來這個問題,直接在邊上做的文章,顯然不對之後好好想想,一個點可以接受的power很可能是從很多條邊流過來的,所以想到,這個點是有流量的,所以拆點經驗:如果每條邊有流量限制的話,那麼就拆點;仔細讀題,挖掘隱含的點流量的條件代碼如下:#include <cstdio>#include <cstring>#include <algorithm>#include
Time of Update: 2018-12-05
這道題是一道最小費用最大流問題,從這道題裡面,我更加理解什麼是最小費用最大流了,主要就是在找最短路徑的同時,還要顧及到最大流量及殘餘網路,其實就是在殘餘網路中找最短路徑有一下要注意的:第一,邊的兩個方向,費用互為相反數第二,無向圖的最小費用最大流,要用鄰接表表示,因為點和點之間的兩個方向的邊要分別表示其反方向,也就是這兩邊是獨立的,不能用互為反邊的思想,否則會出現環路,而且會無限迴圈,SPFA演算法就不通了。還有,提交的時候遇到了submission
Time of Update: 2018-12-05
昨天參加了CF的比賽,結果很糟糕第一題沒有說的,第二題,一看是數論,果斷慌張了,第三看那麼長,又很不想讀結果去看E題,想了一會,感覺有點像2-SAT,但是看資料那麼大,就又返回去了,結果接著看B題,其實B很簡單的,C題也很水的,唯一需要注意的是資料規模比較大,需要把變數設為long long
Time of Update: 2018-12-05
題目的大意是:今天小雲和小塘玩起了跳格子的遊戲,小雲對小塘說:我在地上給你畫一些格子,格子裡面會出現下面的這些符號‘S’ 表示你要從這個格子開始‘X’ 表示這個格子不能跳‘.’ 表示這個格子可以跳‘D’ 表示跳到這個格子就結束了然後我告訴你要跳的步數,每跳一格算一步,你能恰好跳到終點嗎?Input輸入包含多組測試資料,每組測試資料的第一行有三個數N,M,S (1 < N, M < 7;0 < S< 50),分別表示格子的行數、列數和走的步數。當N,M,S均為0
Time of Update: 2018-12-05
這道題,第一wa了,因為我沒有注意它可能是存在自環以及重邊的很水的一道最大產生樹的題代碼如下:#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110;const int INF = -1;const int INFB = 10000;int T, n, m, g[N][N], p[N], pa;void prim() {
Time of Update: 2018-12-05
dfs的深入挖掘應該是分為幾個部分,今天學習了大概三個部分第一:連通分量 ( 並查集也能做 )判斷一個圖有幾個連通分量,並且為每個點標號---說明它是屬於哪一個連通分量的那麼dfs函數可以寫成如下:void dfs(int u ) { for ( int i = 1; i <= n; ++i ) if ( !vis[i] && map[u][i]) { cc[i] = count;
Time of Update: 2018-12-05
這是很簡單的最大流的題目,問題的重點在於如何建圖題目大意:分配襯衫,將這些襯衫分給志願者,每個志願可以接受兩種size,每種衣服的數量相同,每種衣服都有一手號(即從XS到XXL六個碼)求是否存在這樣的分配那麼設0為原點,m+7為匯點,將六個型號分別設點然後從原點到型號點的容量設為其數量(看題就知道了,數量很好求),從型號到每個志願者連起來,容量為1,志願者只需要一件衣服,從志願者到匯點連線,容量為1代碼如下:#include <cstdio>#include
Time of Update: 2018-12-05
這道題主要思想就是建圖,拆點,判斷判斷最大流是不是等於銀行個數拆點,每個點只能經過一次,有容量的點都拆成進點和出點,從進點進,從出點出建圖,將所有的點重新編號,bank和的進點和源點相連,容量為1;grid的四框上的點的拆出來的點和匯點相連,容量INF;每個點對應的進入點和出點容量為1;每個點的出點和上下左右的點的進點相連,容量為1代碼:#include <cstdio>#include <cstring>#include
Time of Update: 2018-12-05
題目: 給一個數N,N>= 0, N < 5000, 然後給出m個數,求N的最小倍數,這個倍數比一定是有這m個數組成,比如N=12, m個數裡面有1,2, 那麼12是N的最小倍數,是有m個數字中的1和2合成的。注意,m中的每個數字是可以重複使用的。解析:第一,分析可知,由於它是加的位元,而不是數字,所以,對於數一定要有處理,不可能盲目的追加位元!第二,這m個數,根據題意,可以組成的數字是無窮多的所以,這裡需要一個解決的辦法,那就是取餘。事實上,任何一個數對n取餘,一共只能有n個結果(
Time of Update: 2018-12-05
這是一道很典型的最小割最大流定理,通過這道題,我再一次學習了最小割的定義最小割,就是在所有割中,容量之和最小的割,這就是我的理解,而最小割的值就是最大流的值,因為很容易想到,從源點s到匯點t的最大流必然會經過割邊,那麼就有最大流f<=c(割邊的值),那麼也就是說,當c==f的時候,就是c為小割,即最大流==最小割第二點,怎麼求出最小割的邊:在求出最大流之後,殘餘網路會分成兩個部分,和源點相連的是一個集合,和匯點相連的是另一個集合,然後用a表示從源點到其他各點的最大流,在求出最大流之後,a&