Time of Update: 2018-12-05
很久以前便想做做K短路了。只是無奈鄙人這苦逼的小菜啊~。首先講講A*演算法吧。眾所周知,A*演算法就是啟發學習法搜尋,基本形式就是這樣:f(x)=g(x)+h(x);其中f(x)代表在x點所需要的總代價,而g(x)代表:從源點到x點已經耗費的實際代價,h(x)代表從x到終點需要的估計代價,這個函數是一個估計值.而從x到終點真正需要的代價為h*(x),在整個啟發學習法搜尋中我們必須保證h(x)<=h*(x);不然的話會由於對當前的估價值過高,則會引起答案的錯誤。構建A*的關鍵在於準確的規劃一
Time of Update: 2018-12-05
很簡單的最短路問題,其中的關鍵就在於有些農場是沒有牛的,這些農場可以走,但不能算在最終答案中,畢竟題中需要的是牛的最短路徑。將'Z'點作為源點,進行一次赤裸裸的單源點最短路徑,就可以得出答案了。代碼中我用一個hash函數把所有的字母下標點都規整到[1,52]這個範圍內。/*ID:sevenst4LANG:C++PROG:comehome*/#include<stdio.h>#define INF 0x0FFFFFFFusing namespace std;int map[53][53
Time of Update: 2018-12-05
H – 奇幻方陣Time Limit: 1000MSDescription幻方是在一個n*n 的矩陣中放置從1 到n2的數,每個數只出現一次,並且在每行,每列及對角線的和是一樣的。這個問題的焦點是奇數幻方,它意味著n 是奇數,你將使用下面的方法來構造奇幻方陣,最基本的規律是向右上方移動,下面讓我們一步一步進行。1、讓我們開始在最上面的一行的中間放上1(在這個例中n=3)你的任務是寫一個程式去找出哪個數會被放到右下角在n
Time of Update: 2018-12-05
這題卡了我很久!不過也給了我很多的啟示.. 因為自己對線段樹的理解還是很淺顯的所以這個題也便總是過不了,一直卡著卡著。遵照三鮮的原則,現在我做題極少看別人的代碼,但是又沒有人可以和我一起討論的,所以今天還是看了下別人的解題報告,因為我想不出了,看著看著我發現了一個問題----->我丫的把題目讀錯了!太2了!區間合并線段樹已經學習的差不多了,可能會在小的細節方面出點叉子,但是對基本的線段樹運用的得還不錯了。認真的去體會線段樹的美,二叉的精巧,與構思的美妙。還是那句話:二叉樹只是一個資料結構,
Time of Update: 2018-12-05
NOS神犇部落格裡的一句通常這對初學者來說是一道坎嚇得我3天沒有看線段樹= = 因為鄙人是新手啊.....昨晚臨睡前想弄懂段查詢段更新的線段樹,結果還就真的弄懂了;這種線段樹用了延遲標記以及其操作PushDown;延遲標記代表當前區間的值為多少。PushDown則用來將當前點若有延遲標記則向下推送,後置零。#include<iostream>#define MAXN 100001using namespace std;int sum[ MAXN<<2 ];int
Time of Update: 2018-12-05
採用二分的方法,尋找是否可見對面的籬笆。左邊,右邊兩方收縮,採用點積叉積判斷是否相交。代碼很醜.... 無視.../*ID:bysenLANG:C++PROG:fence4*/#include<stdio.h>#include<algorithm>#include<cmath>#define MAXP 201#define ERROR 1e-6using namespace std;struct Point{ double
Time of Update: 2018-12-05
終於會寫DP了,這種水水的還是能寫的~ 嘿嘿~/*ID:bysenLANG:C++PROG:rockers*/#include<stdio.h>using namespace std;int DP[21][21][21];int time[21];int N,T,M; int max( int a,int b ){ return a>b?a:b; }int getDP( int k,int t,int j ){ int ret=0; for( int i=0;i<j;i+
Time of Update: 2018-12-05
第一次做差分約束的題,和zzy神牛一起做的,今天的目標還是3題,這是第一題。差分約束就是有N個點M個約束條件,去尋找所需要的東西。可以用SPFA也可以用BellmanFord,但是這個題的問題在於沒有原點,於是乎~1.>建立一個超級原點,該原點到所有的店的距離都是0,將所有點都入隊,再通過SPFA去尋找最短路徑。如果說從超級原點到任何點的距離變成了負數,也就是說存在一個負環,這樣便會進入死迴圈。輸出無解。2.>將所有點都入隊,標記。當隊首元素為INF時,將其修改為0,作為原點。這樣可
Time of Update: 2018-12-05
悲劇的隊內賽,我還是太弱了= = 倒數第二的好成績啊~~悲劇的代碼= = 300+啊~~~#include <iostream>#include <vector>#include <stack>#include <stdio.h>#include <string.h>#include <stack>#include <map>using namespace std;struct node{ int
Time of Update: 2018-12-05
B - 釘子和小球Time Limit: 1000MSDescription有一個三角形木板,豎直立放,上面釘著n(n+1)/2 顆釘子,還有(n+1)個格子(當n=5 時1)。每顆釘子和周圍的釘子的距離都等於d,每個格子的寬度也都等於d,且除了最左端和最右端的格子外每個格子都正對著最下面一排釘子的間隙。讓一個直徑略小於d 的小球中心正對著最上面的釘子在板上自由滾落,小球每碰到一個釘子都可能落向左邊或右邊(機率各1/2),且球的中心還會正對著下一顆將要碰上的釘子。例2
Time of Update: 2018-12-05
隊內比賽又悲劇了,咱們隊各種不在狀態啊~ 我悲劇的計算幾何就這麼悲催咯~ 不過是個好題,可以用來做模板了。線段相交分為幾種情況,1不相交,2,重疊,3相交端點線上上,4相交端點不線上上。為什麼還是這麼弱啊~~ 和我不想編代碼有關係!加油啊~狐狸#include<stdio.h>#include<cmath>#include<string.h>#define eps 1e-7struct node{ int x,y;};struct segment{
Time of Update: 2018-12-05
拷的POJ的代碼,直接A了。/*ID:bysenLANG:C++PROG:heritage*/#include<iostream>#include<stdio.h>#include<string>#include<fstream>using namespace std; ifstream fin("heritage.in"); ofstream fout("heritage.out"); int strlen( char *a ){ int
Time of Update: 2018-12-05
很少去自己構建枚舉法,一般遇到題就是直接的DFS,BFS顯然這樣的編碼複雜度很高。太久沒有做題了連這道水題都用了我一上午,也對自己的思維有協助吧,簡單的事情複雜化了。實在不是我所希望的啊... 調試了N久都沒弄出來!好吧說說這題的思路:首先明確的一點就是這題不需要用到DFS,用DFS和BFS的話就要用位操作壓縮狀態,一位位操作還是很方便的,但是兩位位操作寫起來就不那麼好看了。我們知道,對於9個位置,在同一個位置按下4次的話,相當於沒有按下。於是對於同一個位置最多按下3次咯。枚舉的就是這九個位置,
Time of Update: 2018-12-05
簡單的枚舉題。題意是在一個集合S中求等差數列,輸出等差數列的首項與公差。集合S中的元素是兩個非負數的平方和。題目給出等差數列的項數,集合元素的範圍。思路:用一個bool數組記錄該位置的數是否屬於集合S。如果直接枚舉公差很容易逾時。這裡可以減枝,使用一個list數組將bool數組中有效元素全部儲存起來。這樣取出首項與公比就更快速了。另外要最佳化的就是判斷最後一項是否在集合S中。/*ID:seven4LANG:C++PROG:ariprog*/#include<stdio.h>#incl
Time of Update: 2018-12-05
很久沒有做題了,詳細統計呢有兩個月了。浪費了兩個月做了一些無關痛癢的事情。在這裡對我的隊友說聲對不起了...接下來好好做題吧..盡量多做點多感悟一點。分析:這題在題目裡面說得很清楚了,有6種情況,其實這六種情況只是4個矩形的不同擺法。和他的長寬怎麼擺是沒有關係的。其中1-5的情況是固定的,因為這幾種情況比較簡單,每個矩形各自的長寬對集合出的大矩形的長寬影響不大。下面重點分析的就是第六種:不用管題中的圖怎麼話,實際上6個圖的意思只是矩形的位置,和長寬放置並沒有關係。認真你就輸了!按這樣放置,其實題
Time of Update: 2018-12-05
G-WindTime Limit : 3000/2000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)Total Submission(s) : 123 Accepted Submission(s) : 13Font: Times New Roman | Verdana | GeorgiaFont Size: ← →Problem DescriptionN棵樹和M個蘑菇排成一排. 每棵樹有自己的座標和高度,
Time of Update: 2018-12-05
覺得專業課學習有點落下了,而且acm這方面也沒有弄好= =蛋疼死了!!稍微寫寫部落格就開始學習吧!!矩陣的快速冪和a^b%n類似。運用二分的思想。在這題中需要計算的是A+A^2+A^3+...+A^k的和,由於矩陣相乘有結合律,所以!@#$%^&*.....不多說了,代碼很醜。還是拿來佔個位置吧.... 第二次寫遞迴啊!!我的神啊~~#include<iostream>#define MAXN 31using namespace std;struct Matrix{
Time of Update: 2018-12-05
這些天一直在啃HH牛的線段樹完全版裡面講得比我的結題報告好多了。弱菜飄過......其實我只是看懂了神犇的代碼,然後自己手動類比一遍,然後把CODE默寫出來.....裡面的實現還是有些不懂....乾脆自己寫個注釋利於理解好了.....弱菜覺得難處理的地方就是 合併作業 PushDown 和 PushUp故添加了注釋 #include<iostream>#define MAXN 50005using namespace std;int lsum[MAXN<<2],msum[
Time of Update: 2018-12-05
一道很蛋疼的題... 雖然很明顯的差分約束,但是我就是那麼錯了。N久N久啊~~到現在我還是不知道為甚麼!!!雖然很明顯的是差分約束題,而且網上的資料亂七八糟的.... 看到了兩條有用的結論:1.求最大值,採用最短路徑求法。2.求最小值,採用最長路徑求法。但是!為什麼啊?為什嗎??看來我還是對圖論理解不深啊....稍後繼續想想這題吧....#include<iostream>#include<queue>#define INF 0x7F7F7F7F#define MAXN
Time of Update: 2018-12-05
模板題,一直想用SPFA來做,可是這題卻遇到了麻煩。因為對於原來的題來說一直想弄懂那個超級原點是怎麼做的。這次用SPFA弄了N久,還是沒弄出來... 後來果斷用了BellmanFord()裸A啊....原來Bellman比SPFA還要好寫,果斷不用Dijstra了~#include<iostream>#include<queue>#define MAXN 103#define INF 0x7F7F7F7Fusing namespace std;/*struct Node{