Time of Update: 2018-12-05
題目連結 題目很長,看加猜加Google翻譯才看懂了題目。每級台階的寬都是1,但高不同,並且告訴你了,然後給你m個箱子,長和寬都告訴你,把箱子靠左放,求箱子的底部有多高。 因為都是放在最左邊的,所以只要和最左邊的高度比較,這樣就不用更新線段樹了。代碼://cf 272 C//2013-05-14-20.26#include <stdio.h>using namespace std;const int maxn = 100005;struct node{ int l,
Time of Update: 2018-12-05
這道題,要好好寫一下總結。開始的時候,我把貓和狗作為頂點,求最大獨立點集,但是後來發現,這個是有問題的。畫了一個圖,然後類比了範例2,發現這個邊可以重複,也就是說可有不同的小孩的like和dislike是一樣的,那麼這中情況下,刪除一個點,可是多少個孩子高興就不一定了。於是感覺到這建圖是有問題的。仔細分析一下題目,說刪除一個孩子不喜歡的動物,會使這個孩子,但是喜歡這個動物的孩子就會不高興,想讓高興的孩子儘可能的多,那麼就要刪除儘可能少的有孩子喜歡的動物,也就是說孩子和孩子之間是有衝突的,一旦孩子
Time of Update: 2018-12-05
題目大意就是給出一個矩陣,每個格子裡面要麼是0,
Time of Update: 2018-12-05
這道題是很經典的最小路徑覆蓋問題。最小路徑覆蓋,是指在有向非循環圖中,選擇最少的點作為起點,使得遍曆圖中所有的點有且僅有一次。因此,每個單獨的頂點可以看做是一條路徑。最小路徑覆蓋=N-原圖的最大二分匹配數。代碼:#include <cstdio>#include <cstring>const int N = 150;int n, m;int bmap[N][N], cy[N];bool vis[N];bool dfs( int u ) { for( int i =
Time of Update: 2018-12-05
這道題題是很經典的建模的題目,也是比較基礎的二分匹配題目。二分最小覆蓋就是說選擇儘可能少的點,然後使得每條邊至少有一個端點被選中。可以證明的是最小覆蓋數就是最大匹配數。代碼:#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 510;int n, k;int g[N][N], cy[N];bool used[N];bool dfs(
Time of Update: 2018-12-05
把有可能在一起的連邊,求最大獨立點集代碼:#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>using namespace std;const int N = 550;struct pupils { int h; string sex; string music; string
Time of Update: 2018-12-05
這道題最難的部分就是建圖,能想到怎麼建圖,就沒有問題了,直接套模板即可。建圖:將每個‘#’的格子作為一個節點,和與它相鄰的格子連線,構建一個圖,求這個圖的最大二分匹配!要注意的是,這個圖的最大二分匹配,是把所有的‘#’既做為左邊,有作為右邊,因此,匹配出來的是答案的二倍。即一個點被匹配了兩次,因為在建圖的過程中,比如(1,2)這條邊,它還有對應的(2,1)這條邊,仔細看看建圖,畫一下就懂了!代碼:#include <cstdio>#include
Time of Update: 2018-12-05
就是很白的Nim博弈,沒有什麼可說的但是我交了有6次才過這道題是最後一個拿走的人是輸的人,情況和最後拿走的人贏的不同總結一下要注意的:第一就是要判斷是S態還是T態 ; 第二就是要判斷是S0狀態還是T2狀態,是的話就是必輸的代碼如下:#include <cstdio>int T, n, x, ans, s0, t2;int main(){ scanf("%d", &T); while ( T-- ) { s0 = t2 = 0;
Time of Update: 2018-12-05
這道題目,點數比較多,用匈牙利演算法會逾時!題目很簡答,現在發現二分匹配建圖很重要。這道題就是把人和人能在t時間內可以拿到的雨傘連起來即可,一左一右。很傻的錯誤就是在最後輸出的時候,printf函數裡面應該是表示資料群組號的地方的%d我直接寫成1,導致最後結果會變成1 2 3……所以以後寫代碼還是要注意格式,注意格式的邏輯性和保證思維的清晰度!代碼如下:#include <cstdio>#include <cstring>#include
Time of Update: 2018-12-05
這道題wa了三次很可惜,其實很簡單!第一次是RE,32*32=1024,好丟人!第二次是沒注意,(x,y)表示y行x列,直接按照原有經驗,搞成了x行y列!丟人!第三次是雙層for迴圈,j的那個內層迴圈只迴圈到n結束,正確的是應該到m結束!這篇總結必然好好儲存,寫代碼真的要認真!代碼:#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using
Time of Update: 2018-12-05
題目大意:在一個平面上,放炸彈。每次給出兩個位置,在這兩個位置裡面選擇一個放炸彈。一共給出n組位置,如前面所述,每組有個兩個位置。然後,對於每個炸彈,都有一個power,即爆炸時的破壞的半徑,這個半徑是可以控制的,幾就是說,以所選的位置為圓心的半徑可以控制的圓。要求圓和圓之間不能有交集,可以相切。求解,滿足n個圓無交集的最大的半徑是多少?題目分析:首先,是這個半徑應該是多少,其實要求n個圓的半徑裡面最小的是多少,我們就可以假設這n個圓的半徑是相同的,因為相同的一組數中,最小值就是這個數。那麼半徑
Time of Update: 2018-12-05
這道題要求對二分匹配有一個比較詳細的瞭解!同時還要動一點小小的腦筋!和hdu4185是一個建圖思想,然後不一樣的是,4185裡面不要求覆蓋所有的點,但是這個題目是要求覆蓋所有的點,用少的橢圓!那麼很顯然,要求一個最大匹配,然後看有幾個點沒有匹配上的,就在最大匹配的基礎上加上幾個橢圓!還有,這道題,第一次提交RE了,是因為我把數組最大訂到了40,忘記了如果給每個點標記後,一共最多可能有400個點,這個很重要!所以要清楚你建的用來進行二分匹配的圖一共最多有多少點!感覺二分匹配是考研思維的,代碼都差不
Time of Update: 2018-12-05
題目:在一個圈上,數字按照順時針方向,從0-n。有m條邊,每條邊串連一對點,這每條邊可以畫在圓的外側,也可以畫在圓的內側,但是不能相交。輸入會給出點的個數N,和邊的條數M,求解知否有可能滿足所有邊不相交的條件題目分析:開始的時候,我沒有反應過來是2-SAT的題目。但是題目中有一點是很明顯的,那就是邊的位置只有兩種,一種圓內,一種圓外,那麼兩條邊如果在圓的同側(同為內側或外側)相交的話,就要一定要把他們的位置分開,即使得一條邊在內,另一條在外。這樣就是很明顯的2-SAT的題目了。那麼接下來就是資料
Time of Update: 2018-12-05
這題明顯和普通的bfs不一樣,因為普通的bfs就是vis[][]二維狀態的搜尋,走過以後的路徑是不能退回的,但是這裡應該是可以退回,所以用了個vis[x][y][dir][color]dir 在x,y格子上 表示當前的方向,color表示在x y
Time of Update: 2018-12-05
這題真的不會 參考了一下別人的:(define (subsets s) (if (null? s) (list null) (let ((rest (subsets (cdr s)))) (append rest (map (lambda(x) (cons (car s) x))
Time of Update: 2018-12-05
水!瞬秒的題目!如有不懂,就看演算法吧!但願這次比賽有這樣水的題目,哈哈!代碼:#include <cstdio>#include <cstring>const int N = 220;int ln, rn, bmap[N][N], cy[N];bool used[N];bool dfs( int u ) { for ( int v = 1; v <= rn; ++v ) if ( bmap[u][v] && !used[v] ) {
Time of Update: 2018-12-05
這個類型的題目很典型,就是 二分+2sat題目:在一個座標繫上,有n個點,每個點貼上標籤,標籤是正方形的,粘貼的位置要使得點正好在標籤的上邊中間,或者下邊中間,標籤之間不能重合,求解,標籤的最大邊長是多少?分析:這道題和前天做的拿到反炸彈的題目很類似,都是用二分尋找找最大值,然後一個一個用2-sat判斷可行性這道題的代碼,我寫得實在太憋屈了,犯了很低級的錯誤,簡直就是一個馬虎神。最忌諱的就是知道演算法和模板,最後細節出錯!以後必須要細心!代碼如下:(鄰接鏈表)#include
Time of Update: 2018-12-05
這道題是求最大獨立點集!最大獨立點集=N - 最小頂點覆蓋=N-最大匹配。反建圖,將不認識的連上邊!代碼:#include <cstdio>#include <cstring>const int N = 220;int ln, rn, M;int bmap[N][N], cy[N];bool used[N];bool dfs( int u ) { for ( int v = 1; v <= rn; ++v ) if ( bmap[u][v]
Time of Update: 2018-12-05
#include <stdio.h>#include <string.h>#include <stdlib.h>#define max 100char stack[max];int top;int empty(){ if( top == 0 ) return 1; return 0;}int main(){ char in[max], out[max]; int n, j, q[max], l, i; while(
Time of Update: 2018-12-05
剛開始想得難了,打算把二分圖建出來,把頂點分開!其實不用,直接對原圖求最大匹配,然後除以2.這裡剛開始敲模板,把下標弄錯了,題目是從0開始,我直接從1開始!還有一件事情,一定一定要記得,就是給bmap初始化!!!!很重要,至關重要的!!!代碼:#include <cstdio>#include <cstring>#include <queue>using namespace std;const int N = 1515;const int INF =