算法競賽入門經(jīng)典(算法實現(xiàn))_第1頁
算法競賽入門經(jīng)典(算法實現(xiàn))_第2頁
算法競賽入門經(jīng)典(算法實現(xiàn))_第3頁
算法競賽入門經(jīng)典(算法實現(xiàn))_第4頁
算法競賽入門經(jīng)典(算法實現(xiàn))_第5頁
已閱讀5頁,還剩575頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

(算法實現(xiàn))第2章算法設(shè)計與優(yōu)化2.1算法優(yōu)化策略2.4動態(tài)規(guī)劃算法3.4組合游戲3.6矩陣和線性方程組第4章數(shù)據(jù)結(jié)構(gòu)4.1基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)4.2區(qū)間信息維護4.3排序二叉樹4.4樹的經(jīng)典問題與方法4.6離線算法4.7kd-Tree4.8可持久化數(shù)據(jù)結(jié)構(gòu)4.9嵌套和分塊數(shù)據(jù)結(jié)構(gòu)第5章字符串5.1Trie、KMP以及AC自動機第6章計算幾何6.1二維幾何基礎(chǔ)6.2與圓有關(guān)的計算問題6.3二維幾何常用算法6.4三維幾何基礎(chǔ)6.5幾何專題算法7.2最短路問題isthequestion".Tobeornottobe,''quoththe//陳鋒EQ\*jc3\*hps20\o\al(\s\up13(ch),w)EQ\*jc3\*hps27\o\al(\s\up1(e),c)EQ\*jc3\*hps20\o\al(\s\up13("};),EO)1|算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題3-1大的順序輸出。usingnamespacestd;_for(i,a,b)for(inti=(a);i<(b);++intn,a,cnt[MAXN+4];fill_n(cnt,MAXNfor(i,0,n)scanf("td",for(i,0,MAXN)_for(jprintf("%dss",i,(i--MAXN-166j--cnt[i]-1)?""for(i,0,MAXN)_for(j}算法分析請參考:《算法競賽入門經(jīng)典——訓(xùn)練指南》升級版1.3節(jié)例題17注意:本題中的fill_n函數(shù)比memset更方便,性能更好【代碼實現(xiàn)】如果還要精益求精,可以優(yōu)化輸入輸出,進一步降低運行時間,程序如下。//劉汝佳EQ\*jc3\*hps30\o\al(\s\up5(charEQ\*jc3\*hps30\o\al(\s\up5(char),whil)EQ\*jc3\*hps30\o\al(\s\up3(c),e)EQ\*jc3\*hps30\o\al(\s\up2(g),s)EQ\*jc3\*hps30\o\al(\s\up3(a),t)//為了使用isdigit宏})buf[p++]=i810,i})//聲明為全局變量可以減小開銷p=0;if(i<0)putchar('-'),i=//特殊情況:i等于0時需要輸出0,而不是什么也不輸出j=p-1;j>=0;j--)putchar('O'+buf[j]);//逆序輸出EQ\*jc3\*hps30\o\al(\s\up8(int),wh)EQ\*jc3\*hps30\o\al(\s\up8(,),n)EQ\*jc3\*hps30\o\al(\s\up8(1),r)EQ\*jc3\*hps30\o\al(\s\up8(0),e)EQ\*jc3\*hps30\o\al(\s\up8(;),i)EQ\*jc3\*hps19\o\al(\s\up11(,0,),st)EQ\*jc3\*hps30\o\al(\s\up5(=),0)EQ\*jc3\*hps30\o\al(\s\up5(1),;)EQ\*jc3\*hps19\o\al(\s\up6(if),f)EQ\*jc3\*hps19\o\al(\s\up6(fi),r)EQ\*jc3\*hps19\o\al(\s\up6(ha),0)}})輸入一個字符串,判斷它是否為回文串以及鏡像串。輸入字符串保證不含數(shù)字0。所謂和原串相同,如2S和3AIAE。注意,并不是每個字符在鏡像之后都能得到一個合法字符。在本題中,每個字符的鏡像如圖1-1所示(空白項表示該字符鏡像后不能得到一個合法字CharacterReverseCharacterReverseCharacterR輸入的每行包含一個字符串(保證只有上述字符,不含空白字符),判斷它是否為回文串和鏡像串(共4種組合)。每組數(shù)據(jù)之后輸出一個空行?!緲永斎搿俊緲永敵觥縉OTAPALINDROME--isnotapalISAPALINILAPASI--isaregularpalindrome.ATOYOTA-isamirroredpalindrome.EQ\*jc3\*hps19\o\al(\s\up10(",s),e)if(s[i]!=s[len-1-i])p=0;//不是回文串if(r(s[i])!=s[len-1-i])m=0;//不是鏡像串)}算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題3-3注意:本題中輸入字符串應(yīng)該使用scanf而不是gets,以避免出現(xiàn)讀入空行的問題長度為n的環(huán)狀串有n種表示方法,分別為從某個位置開始順時針得到的字母序列。例在這些表示法中,字典序最小的稱為“最小表示”。樣式對應(yīng)該串所有表示方法中的一種表示法,你的任務(wù)是輸出該環(huán)狀串的最小表示。例如,【代碼實現(xiàn)】//劉汝佳intless_than(conststringss,intintn=s.lengthcharcp=s[(P+i)8n]))ios::sync_with_stdio(false),)1例1-5【二進制;輸入技巧;調(diào)試技巧】信息解碼(MessageDecoding,ACM/ICPCWF考慮下面的01串序列:首先是長度為1的串,然后是長度為2的串,以此類推。如果看成二進制,相同長度的后一個串等于前一個串加1。注意,上述序列中不存在全為1的串。你的任務(wù)是編寫一個解碼程序。首先輸入一個編碼頭(如AB#TANCnrtXc),則上述序列的每個串依次對應(yīng)編碼頭的每個字符。例如,0對應(yīng)A,00對應(yīng)B,01對應(yīng)#,…,110對應(yīng)X,0000對應(yīng)c。接下來是編碼文本(可能由多行組成,你應(yīng)當(dāng)把它們拼成一個長長的01串)。編碼文本由多個小節(jié)組成,每個小節(jié)的前3個數(shù)字代表小節(jié)中每個編碼的長度(用二進制表示,例如010代表長度為2),然后是各個字符的編碼,以全1結(jié)束(例如,編碼長度為2的小節(jié)以11結(jié)束)。編碼文本以編碼長度為000的小節(jié)結(jié)束。例如,編碼頭為$#**\,編碼文本為0100000101101100011100101000,應(yīng)這樣解碼:010(編碼長度為2)00(#)00(#)10(*)11(小節(jié)結(jié)束)011(編碼長度為3)000(\)111(小節(jié)結(jié)束)001(編碼長度為1)0($)1(小節(jié)結(jié)束)000(編碼結(jié)束)。【代碼實現(xiàn)】//此版本保留調(diào)試語句t11while(len--)v=v*2+readchar)memset(code,0,sizeof(c11EQ\*jc3\*hps22\o\al(\s\up7(o),o)EQ\*jc3\*hps22\o\al(\s\up7(i),r)EQ\*jc3\*hps22\o\al(\s\up7(i),e)EQ\*jc3\*hps22\o\al(\s\up7(nt),n)EQ\*jc3\*hps22\o\al(\s\up7(d),1)))intlenwread_bin_Inif(vm=(1<<len)-1)break;putchar(code[len][v]EQ\*jc3\*hps15\o\al(\s\up6(1),p)11算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題4-4例1-6【排序和查找】大理石在哪兒(WhereistheMarble?,UVa10474)現(xiàn)有N個大理石,每個大理石上寫了一個非負整數(shù)。首先把各數(shù)從小到大排序,然后回答Q個問題。首先回答是否有一個大理石上寫著某個整數(shù)x,如果是,還要回答哪個大理石上寫著x。排序后的大理石從左到右編號為1~N(在樣例中,為了節(jié)約篇幅,所有大理石上的數(shù)合并到一行,所有問題也合并到一行)?!緲永斎搿?【樣例輸出】【代碼實現(xiàn)】EQ\*jc3\*hps25\o\al(\s\up11(int),fo)EQ\*jc3\*hps25\o\al(\s\up11(m),t)EQ\*jc3\*hps25\o\al(\s\up11(];),n)for(inti=0;i<n;i++)scanf(for(inti=0;i<n;i++)scanf(intp=lower_bound(a,a+n,x)-a;//在已排序數(shù)組a中尋找x))}算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題5-1注意:本題中l(wèi)ower_bound函數(shù)的使用,這里它返回的是指針,通過減法運算可以得到其在數(shù)組中的位置例1-7【stack;set實現(xiàn)集合操作】集合棧計算機(TheSetStackComputer,ACM/ICPCNWERC2006,U每次操作后,輸出棧頂集合的大小(即元素個數(shù))。例如,棧頂元素是A={{},{{}}},下一個元素是B={{},{{{}}}},則:UNION操作將得到{{},{{}},{{{}}}},輸出3。ADD操作將得到{{},{{{}}},{{}typedefset<int>Set;//查找給定集合x的ID。如果找不到,分配一個新IDif(IDcache.count(x))returnIDcache[x];returnIDcache[x]-Setcache.size()-1;)//把集合映射成ID//添加新集合EQ\*jc3\*hps25\o\al(\s\up9(in),o)//題目中的棧if(op[01=='P')s.push(ID(empty));elseiftop[0]=='D')s.push(s.top());constSet6x1=SetcachelsconstSet6x2=SetcachelsEQ\*jc3\*hps29\o\al(\s\up10(l),o)set_union(x1.begin(),x1.end(),x2.begEQ\*jc3\*hps29\o\al(\s\up6(i),o)EQ\*jc3\*hps29\o\al(\s\up6(n),p)EQ\*jc3\*hps29\o\al(\s\up6(se),0])EQ\*jc3\*hps29\o\al(\s\up6(x),x)EQ\*jc3\*hps29\o\al(\s\up6(n),x)EQ\*jc3\*hps29\o\al(\s\up5(;),e))cout<<Setcache[s.top()].size()<<end1;)))算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題5-5注意:本題中對于set_unton以及set_intersection的使用#)while(cin>>s66s.front()!='#')words.pusfor(size_ti=0;1<worif(cnt[repr(words[1])]==1)ans.push_back(EQ\*jc3\*hps23\o\al(\s\up8(s),f)EQ\*jc3\*hps23\o\al(\s\up8(o),o)EQ\*jc3\*hps23\o\al(\s\up8(r),r)EQ\*jc3\*hps23\o\al(\s\up8(a),i)EQ\*jc3\*hps23\o\al(\s\up8(n),z)EQ\*jc3\*hps23\o\al(\s\up8(i),0)EQ\*jc3\*hps23\o\al(\s\up8(n),;)EQ\*jc3\*hps23\o\al(\s\up8(,ans.),<ans)EQ\*jc3\*hps23\o\al(\s\up8(en),si)EQ\*jc3\*hps23\o\al(\s\up8(d),z))例1-9【queue的使用】團體隊列(TeamQueue,UVa540)有t個團隊的人正在排一個長隊。每次新來一個人時,如果他有隊友在排隊,那么這個新人會插隊到最后一個隊友的身后。如果沒有任何一個隊友排隊,則他會排到長隊的隊尾。輸入每個團隊中所有隊員的編號,要求支持如下3種指令(前兩種指令可以穿插進行)。【代碼實現(xiàn)】typedefqueue<int>IntQ;for(intt,kase-1;scanf("%d",6t)--165t;kase表示編號為x的人所在的團隊編號while(n--)scanf("%d",6x),team[}IntQtq,qs[maxt];//tq是團隊的隊列,而qs[i]是團隊i成員的隊列for(intx;scanf("%s",cmd)=-1&5EQ\*jc3\*hps20\o\al(\s\up5(cmd[),Int)printf("%d\n",q.front()),q·pop(if(q.empty())tq.push(team[x]);//)}}算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題5-6注意:隊列的出隊操作由front()獲取隊頭元素以及pop()組成圖1-3數(shù)據(jù)庫EQ\*jc3\*hps22\o\al(\s\up5(EQ\*jc3\*hps22\o\al(\s\up5(si),it)EQ\*jc3\*hps22\o\al(\s\up5(.f),g)EQ\*jc3\*hps22\o\al(\s\up5(i),:)EQ\*jc3\*hps22\o\al(\s\up3(n),:)EQ\*jc3\*hps22\o\al(\s\up4(,l),s)EQ\*jc3\*hps22\o\al(\s\up3(o),s)EQ\*jc3\*hps22\o\al(\s\up5(+),gt)/1本程序只是為了演示5TL各種用法,效率較低。實踐中一般用c字符串和哈希表來實現(xiàn)typedefpair<int,int>PII;constintmaxr·10000+5,maxe-1intm,n,dh[maxr][maxc],cnt;)PIIp-make_pair(db[A][el],printf("sdtd\n",dtpl+1,1EQ\*jc3\*hps26\o\al(\s\up6(nt-),or)EQ\*jc3\*hps26\o\al(\s\up6(1),n)db[i](j】=ID(s,substr(lastpos+1,P-lastpos-1)111算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題5-9注意:本題中string的tind以及substr的使用BugHunt,ACM/IC例1-11【vector的使用】木塊問題(TheBlocksProblem,UVa101)從左到右有n個木塊,編號為0~n-1,要求模擬以下4種操作(a和b都是木塊編號)。moveaontob:把a和b上方的木塊全部歸位,然后把a摞在b上方。moveaoverb:把a上方的木塊全部歸位,然后把a放在b所在木塊堆的頂部。pileaontob:把b上方的木塊全部歸位,然后把a及其上方的木塊整體摞在b上pileaoverb:把a及其上方的木塊整體摞在b所在木塊堆的頂部。所有操作結(jié)束后,輸出每個位置的木塊列表,按照從底部到頂部的順序排列?!敬a實現(xiàn)】usingnamespacestd;intN;//找木塊a所在的pile和height,以引用的形式返EQ\*jc3\*hps30\o\al(\s\up3(intfi),intp)EQ\*jc3\*hps30\o\al(\s\up3(b),;)EQ\*jc3\*hps30\o\al(\s\up7(+),p)if(pile[p][h]==a)return}for(size_ti=h+1;i<s,s}//把木塊b放回原位//pile只應(yīng)保留下標0~h的元素EQ\*jc3\*hps30\o\al(\s\up8(void),vect)EQ\*jc3\*hps30\o\al(\s\up8(i),i)EQ\*jc3\*hps30\o\al(\s\up7(,i),p)EQ\*jc3\*hps30\o\al(\s\up6(n),];)}for(autox:pile[i])printf("%))for(inti-0;i<N;i++)pile[i].push_back(iEQ\*jc3\*hps30\o\al(\s\up4(p),a)EQ\*jc3\*hps30\o\al(\s\up4(n),p)EQ\*jc3\*hps30\o\al(\s\up4(d),b)EQ\*jc3\*hps30\o\al(\s\up4(ock),ntin)EQ\*jc3\*hps30\o\al(\s\up4(h),;)if(s1=="move")cle1輸入一個文本,找出所有不同的單詞(連續(xù)的字母序列),按字典序從小到大輸出。單road.Thesignread:"Disneyl【樣例輸入】【樣例輸出(為了節(jié)約篇幅只保留前5行)】a【代碼實現(xiàn)】//陳鋒usingnamespacestd;for(size_ti=0;1<s.les[i]=isalpha(s[i])?tofor(set<string>::iteratorsit-dict.begin();sit!-d例1-13【priority_queue的使用】丑數(shù)(UglyNumbers,UVa136)丑數(shù)是指不能被2,3,5以外的其他素數(shù)整除的數(shù)。把丑數(shù)從小到大排列起來,結(jié)果如1,2,3,4,5,6,8,9,10,12,求第1500個丑數(shù)。【代碼實現(xiàn)】//劉汝佳EQ\*jc3\*hps24\o\al(\s\up10(int),co)EQ\*jc3\*hps24\o\al(\s\up10(ain),int)for(inti=1;x=pq.top(),pq.if(!s.count(x2))s.insert(x2),pq)1例1-14【STL鏈表的使用】破損的鍵盤(又名“悲劇文本”)(BrokenKeyboard輸入包含多組數(shù)據(jù)。每組數(shù)據(jù)占一行,包含不超過100000個字母、下畫線、字符“[”【樣例輸入】【樣例輸出】#include<bits/stdc++.h>typedeflist<char>CL;EQ\*jc3\*hps19\o\al(\s\up13(i),')EQ\*jc3\*hps19\o\al(\s\up13(e.size),line)EQ\*jc3\*hps19\o\al(\s\up13(;),])EQ\*jc3\*hps19\o\al(\s\up13(1),;))))算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題6-4的使用注意:本題對STL中基于雙向鏈表的容器list以及l(fā)ist::iterator的使用同類題目:士兵隊列訓(xùn)練問題,HDU1276圖1-4建筑俯視圖與正視圖輸入每個建筑物左下角坐標(即x、y坐標的最小值)、寬度(即x方向的長度)、深度(即y方向的長度)和高度,以上數(shù)據(jù)均為實數(shù),輸出正視圖中能看到的所有建筑物,按照左下角x坐標從小到大進行排序。左下角x坐標相同時,按y坐標從小到大排序。輸入保證不同的x坐標不會很接近(即任意兩個x坐標要么完全相同,要么差別足夠大,不會引起精度問題)?!敬a實現(xiàn)】//劉汝佳usingnamespacestd;)intN;boolcover(constBuildingsb,doboolvisible(conatBuildingab,doublemx)(//判斷建筑物1在x=mx處是否可見if(!cover(b,mx))ret)EQ\*jc3\*hps27\o\al(\s\up4(r),v)EQ\*jc3\*hps27\o\al(\s\up4(n),c)EQ\*jc3\*hps27\o\al(\s\up4(t),t)EQ\*jc3\*hps27\o\al(\s\up4(k),u)EQ\*jc3\*hps27\o\al(\s\up4(ase),ble)EQ\*jc3\*hps27\o\al(\s\up4(1;),X)EQ\*jc3\*hps27\o\al(\s\up4(s),;)EQ\*jc3\*hps18\o\al(\s\up7(i),])scanf(“81f%1f%1F%1f%1f”,6b.x,6b.y,EQ\*jc3\*hps27\o\al(\s\up2(a),;)1sort(B,B+N),sort(X.beintm=unique(X.begin(),X.end())-X.begin();//x坐標排序去重printf("FormapMd,thefEQ\*jc3\*hps27\o\al(\s\up8(ka),or)nboolvis=false;EQ\*jc3\*hps18\o\al(\s\up9(;j),[)EQ\*jc3\*hps18\o\al(\s\up9(-),1))}}算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題5-12注意:引用變量的使用,在函數(shù)中傳遞引用類型參數(shù)可以節(jié)省內(nèi)存復(fù)制時間,簡化代碼長度本章講解的例題及其囊括的知識點,如表1-1所示。例1-1陳鋒陳鋒二進制:輸入技巧:調(diào)試技巧陳鋒stack;set實現(xiàn)集合操作map的使用qucue的使用陳鋒map的妙用例1-11vector的使用set的使用陳鋒priorityqueue的使用STL鏈表的使用陳鋒第2章算法設(shè)計與優(yōu)化有一些題目并不需要巧妙的思路和縝密的推理,就能找到一個解決方案,只是時間效率難以令人滿意。降低時間復(fù)雜度的方法有很多,本小節(jié)的題目就覆蓋了其中最常見的一些給出N(1≤N<10000且N為奇數(shù))個大小不超過10的正整數(shù),計算這些整數(shù)的中位【代碼實現(xiàn)】//陳鋒intN,A[NN];EQ\*jc3\*hps23\o\al(\s\up11(s),f)EQ\*jc3\*hps23\o\al(\s\up11(,),0)EQ\*jc3\*hps23\o\al(\s\up11(6),;)EQ\*jc3\*hps23\o\al(\s\up11(N),1)例2-2【線性掃描;前綴和;單調(diào)性】子序列(Subsequenc有n(10<n≤100000)個正整數(shù)組成一個序列,給定整數(shù)S(S<10),連續(xù)序列,使它們的和大于或等于S?!敬a實現(xiàn)】求長度最短的//劉汝佳intA[maxn],B[maxn];n,S;scanf("&d8d",6n,8S)--2i=1;1<=n;i++)scanf(=n+1,i=1;i=1;i<=n;i++)B[i]-B[i-1]for(intj=1;j<=n;j++){EQ\*jc3\*hps19\o\al(\s\up8([),[)EQ\*jc3\*hps19\o\al(\s\up8(j),i)EQ\*jc3\*hps19\o\al(\s\up8(tin),B[)EQ\*jc3\*hps19\o\al(\s\up8(u),j)}//(1)沒有滿足條件的i,換下一個j//(2)求滿足B[i-1]<=B[j]-s的最大iprintf("%d\n",ans==n算法分析請參考:《算法競賽入門經(jīng)典——訓(xùn)練指南》升級版1.3節(jié)例題21注意:本題中for嵌套while循環(huán)的時間復(fù)雜度是O(n),而不是0(n^2)//陳鋒_for(i,a,b)for(int1=(a);1<(b);++EQ\*jc3\*hps28\o\al(\s\up8(f),n)EQ\*jc3\*hps28\o\al(\s\up7(o),t)EQ\*jc3\*hps28\o\al(\s\up7(,0,),m)EQ\*jc3\*hps28\o\al(\s\up8(anf),0],)EQ\*jc3\*hps28\o\al(\s\up8(&),ns)_for(i,1,n)ans=max(m-A[i],ans),m=m例2-4【Floyd判圈】計算器謎題(CalculatorConundrum,UVa11549)有一個老式計算器,只能顯示n位數(shù)字。有一天,你無聊了,于是輸入一個整數(shù)k(1≤n≤9,0≤k<10),然后反復(fù)平方,直到溢出。每次溢出時,計算器會顯示結(jié)果的最高n位和一個錯誤標記。然后,清除錯誤標記,繼續(xù)平方。如果一直這樣做下去,能得到的最大數(shù)是多少?比如,當(dāng)F1,k=6時,計算器將依次顯示6、3(36的最高位),9、8(81的最高位),6(64的最高位),3,…【代碼實現(xiàn)】#define_for(i,a,b)for(inttypedeflonglongLL;]EQ\*jc3\*hps25\o\al(\s\up9(M),f)EQ\*jc3\*hps25\o\al(\s\up9(1),r)EQ\*jc3\*hps25\o\al(\s\up11(e),x)EQ\*jc3\*hps25\o\al(\s\up11(s),s)EQ\*jc3\*hps25\o\al(\s\up11(ma),ax)EQ\*jc3\*hps25\o\al(\s\up11(a),n)EQ\*jc3\*hps25\o\al(\s\up11(n),s)EQ\*jc3\*hps25\o\al(\s\up11(s),,)EQ\*jc3\*hps25\o\al(\s\up11(;),;))」算法分析請參考:《算法競賽入門經(jīng)典——訓(xùn)練指南》升級版1.3節(jié)例題1910,-6},D={-16,30,77,-46,62,45},則有5種選法:(-45,-27,42,30),(26,30,-10,EQ\*jc3\*hps23\o\al(\s\up6(t),i)EQ\*jc3\*hps23\o\al(\s\up6(mai),T)EQ\*jc3\*hps23\o\al(\s\up6({),c)EQ\*jc3\*hps27\o\al(\s\up9(can),or)EQ\*jc3\*hps27\o\al(\s\up9(&),n)scanf("%did%d)d",6A[i],6B[iEQ\*jc3\*hps33\o\al(\s\up9(=0),or)for(intj=0;J<n;j++)EQ\*jc3\*hps23\o\al(\s\up8(lon),fo)EQ\*jc3\*hps23\o\al(\s\up8(g),r)EQ\*jc3\*hps23\o\al(\s\up8(lo),nt)EQ\*jc3\*hps23\o\al(\s\up8(t),1)EQ\*jc3\*hps23\o\al(\s\up8(fo),p)EQ\*jc3\*hps23\o\al(\s\up8(r),a)})EQ\*jc3\*hps17\o\al(\s\up12(/*),算)例2-6【滑動窗口】唯一的雪花(UniqueSnowflakes,UVa11572)輸入一個長度為n(n≤10)的序列A,找到一個盡量長的連續(xù)子序列A~A,使得該序【代碼實現(xiàn)】#define_for(i,a,b)for(inti=(a);1<(b);++i)typedeflonglongLL;scanf("8d",6T);iEQ\*jc3\*hps26\o\al(\s\up5(fo),nt)r(i,0,nEQ\*jc3\*hps26\o\al(\s\up5("),1)EQ\*jc3\*hps26\o\al(\s\up5(,),,);//【L,R),滑動窗口長度最大值set<int>s={A[L]);//當(dāng)前窗口中的所有元素,C++11的容器初始化語法ws.count(A[R])66L<R)s.erase(A[)算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題8-7f(3),…,f(n-k+1)。例如,對于序列{5,2,6,8,10,7,4},k=4,則f(1)=2,EQ\*jc3\*hps27\o\al(\s\up12(usingn),#defin)EQ\*jc3\*hps27\o\al(\s\up12(a),e)ios::sync_with_stdio(falwhile(head<tail66Q[head]<=i-K)++head;EQ\*jc3\*hps27\o\al(\s\up8(ile),ta)EQ\*jc3\*hps27\o\al(\s\up7(a),;)4f(1>=K-1)cout<<A[Q[head]]<<(i==N-1//單調(diào)遞增隊列//刪除過期元素//保持單調(diào)性//頂端是最小元素EQ\*jc3\*hps19\o\al(\s\up7(調(diào)遞),Q[)EQ\*jc3\*hps19\o\al(\s\up7(減隊列),head)EQ\*jc3\*hps19\o\al(\s\up7(端),i)EQ\*jc3\*hps19\o\al(\s\up7(最),K)EQ\*jc3\*hps19\o\al(\s\up7(素),h)EQ\*jc3\*hps27\o\al(\s\up8(ile),ta)EQ\*jc3\*hps27\o\al(\s\up7(a),;)if(i>=K-1)cout<<A[Q算法分析請參考:《算法竟賽入門經(jīng)典(第2版)》8.5節(jié)滑動窗口部分注意:本題隊列使用左閉右開區(qū)間,必須使用手寫的隊列而不是deque,才能夠通過時限不會被照到,因為它們從來沒有經(jīng)過圖中矩形的內(nèi)部。圖2-1流星相機的左下角為(0,0),右上角為(w,h)(1≤w;h≤100000)。每個流星用兩個向量p比如,若p=(1,3),v=(-2,5),則t=0.5時該流星的位置為(1,3)+0.5×(-2,5)=(0,【代碼實現(xiàn)】EQ\*jc3\*hps36\o\al(\s\up5(EQ\*jc3\*hps36\o\al(\s\up5(0an;),ty)EQ\*jc3\*hps36\o\al(\s\up5(s1),p)//劉汝佳voidupdate(intx,Inta,Intw,doublesEQ\*jc3\*hps15\o\al(\s\up5(el),L))))//先處理右端點scanf("*d",6T);EQ\*jc3\*hps22\o\al(\s\up4(d",),w)EQ\*jc3\*hps22\o\al(\s\up4(6),,)tdoubleL-0,R-le)))算法分析請參考:《算法競賽入門經(jīng)典——調(diào)練指南》升級版1.3節(jié)例題20另外,本題還可以完全避免實數(shù)運算,全部采用整數(shù)。只需要把代碼中的double全部改成int,然后在update函數(shù)中把所有返回值乘以1cm(1,2,…,10)=2520即可(想一想,為什么)。EQ\*jc3\*hps38\o\al(\s\up2147483641(×),0)EQ\*jc3\*hps27\o\al(\s\up16(a,i),R)EQ\*jc3\*hps27\o\al(\s\up16(i),;)EQ\*jc3\*hps27\o\al(\s\up16({),無)L=max(L,-x*2520R=min(R,(w-x)*2520L=max(L,(w-x)*2520/a);R=min(R,-x)}例2-9【逆序?qū)?shù)計算】參謀(Brainman,POJ1804)給出長度為N的數(shù)組,計算通過多少次相鄰元素的交換操作,可以將其變?yōu)樯颉!敬a實現(xiàn)】EQ\*jc3\*hps20\o\al(\s\up7(cop),int)EQ\*jc3\*hps20\o\al(\s\up7(+1),a)EQ\*jc3\*hps20\o\al(\s\up7(+),1)EQ\*jc3\*hps20\o\al(\s\up7(r),,)EQ\*jc3\*hps20\o\al(\s\up7(,B),b)//歸并排序,求A(1,r)的逆序?qū)?shù)mid=(1+r)/2,ans-merge(1,mid)+merge(mif(]=B[a++];&6B[else//左邊所有比B[b]大的數(shù)分別與B[b]構(gòu)成逆序?qū)Q\*jc3\*hps28\o\al(\s\up8(sca),for)EQ\*jc3\*hps28\o\al(\s\up8(f),i)EQ\*jc3\*hps28\o\al(\s\up10(sca),for)EQ\*jc3\*hps28\o\al(\s\up10(f),i)EQ\*jc3\*hps28\o\al(\s\up10(6),1)printf("Scenario#%d:\n&d\n]*算法分析請參考:《算法競賽入門經(jīng)典(第2版)》8.2.1節(jié)歸并排序、逆序?qū)栴}注意:本題中歸并排序的合并部分僅僅使用了一個循環(huán)本節(jié)例題列表本節(jié)講解的例題及其囊括的知識點,如表2-1所示。例2-1陳鋒陳鋒中途相遇陳鋒滑動窗口滑動窗口:單調(diào)隊列陳鋒陳鋒貪心算法是一種解決問題的策略。如果策略正確,那么貪心算法往往是易于描述和實現(xiàn)的。本節(jié)給出可以用貪心算法解決的若干經(jīng)典問題的代碼實現(xiàn)。例2-10【貪心】裝箱(BinPacking,SWERC2005,UVa1149)給定N(N≤10)個物品的重量L,背包的容量M,要求每個背包最多裝兩個物品。求至【代碼實現(xiàn)】#define_for(i,a,b)for(inti=(a);i<(int)(b);+intn,1,EQ\*jc3\*hps27\o\al(\s\up8(s),i)EQ\*jc3\*hps27\o\al(\s\up8(o),n)EQ\*jc3\*hps27\o\al(\s\up8(r),t)EQ\*jc3\*hps27\o\al(\s\up8(en,),an)EQ\*jc3\*hps27\o\al(\s\up8(rea),0,r)EQ\*jc3\*hps27\o\al(\s\up8(t),i)EQ\*jc3\*hps27\o\al(\s\up8(t>),n)EQ\*jc3\*hps33\o\al(\s\up8(s+),le)EQ\*jc3\*hps33\o\al(\s\up7(e),!)EQ\*jc3\*hps33\o\al(\s\up8(+),r)}})算法分析請參考:《算法競賽入門經(jīng)典——習(xí)題與解答》習(xí)題8-1注意:本題使用了雙指針掃描法EQ\*jc3\*hps31\o\al(\s\up5(o),i)EQ\*jc3\*hps31\o\al(\s\up5(t),s)EQ\*jc3\*hps31\o\al(\s\up5(or),b)EQ\*jc3\*hps31\o\al(\s\up5(<),r)EQ\*jc3\*hps31\o\al(\s\up5(cons),turn)EQ\*jc3\*hps31\o\al(\s\up5(e),b)EQ\*jc3\*hps31\o\al(\s\up5(s),b)for(intn;scanf("8d",6n)==166n;)(for(inti-0;i<n;i++)scanf("&d)d"if(A[i].a>=cur_b)ans++,cur_b=A[i].b;}算法分析請參考:《算法競賽入門經(jīng)典(第2版)》8.4.2節(jié)選擇不相交區(qū)間idefine_for(l,a,b)forstructPointfEQ\*jc3\*hps24\o\al(\s\up6(do),Po)EQ\*jc3\*hps24\o\al(\s\up6(x),u)EQ\*jc3\*hps24\o\al(\s\up6(,),b)EQ\*jc3\*hps24\o\al(\s\up6(;),e)return)douhlem-sqrt(D*D-p.Y*p.y)EQ\*jc3\*hps17\o\al(\s\up5(boo),do)EQ\*jc3\*hps17\o\al(\s\up5(l),u)EQ\*jc3\*hps17\o\al(\s\up5(s),e)EQ\*jc3\*hps17\o\al(\s\up5(gc),y)EQ\*jc3\*hps17\o\al(\s\up5(m),d)EQ\*jc3\*hps17\o\al(\s\up5(co),d)EQ\*jc3\*hps17\o\al(\s\up5(n),c)EQ\*jc3\*hps17\o\al(\s\up5(st),m)EQ\*jc3\*hps17\o\al(\s\up5(S),s)EQ\*jc3\*hps17\o\al(\s\up5(e),1)EQ\*jc3\*hps17\o\al(\s\up5(me),y)EQ\*jc3\*hps17\o\al(\s\up5(t),s)EQ\*jc3\*hps17\o\al(\s\up5(6),r))_for(i,0,N)segs,push_back(getInterseg(pointa(1)EQ\*jc3\*hps24\o\al(\s\up2(or),nt)EQ\*jc3\*hps24\o\al(\s\up2(q),;)doublep-segs[0].y;for(size_t1-1;1<segif(dcmp(cur.x-prev,x)<0)if(dcmp(cur.x-p)>0)P=cur.y11while(cin>>L>for(1,0,N)cin>>points[1].x>>points[1].y;1)EQ\*jc3\*hps13\o\al(\s\up10(/*),算)選點問題例2-13【貪心;區(qū)間覆蓋】噴水裝置(WateringGrass,UVa10382)有一塊草坪,長為1,寬為w。在其中心線的不同位置處裝有n(1≤n≤10000)個點狀的噴水裝置。每個噴水裝置i可將以它為中心,半徑為r的圓形區(qū)域噴濕(見圖2-2)。請選擇盡量少的噴水裝置,把整個草坪全部噴濕。輸出需要打開的噴水裝置數(shù)目的最小值。圖2-2噴水裝置【代碼實現(xiàn)】EQ\*jc3\*hps15\o\al(\s\up5(ub),1t)EQ\*jc3\*hps15\o\al(\s\up5(double),EPS)EQ\*jc3\*hps15\o\al(\s\up5(1),r)1inlinebooloperator<(cons1intsolve(constvector<Seg>6sdoublesif(dcmp(seg=[i].a-start)>0)return-1:while(1<segs.size()6ssegs[1].a<=staif(demp(sege[1].b-end)>0)end)tor(intn,1,w;scanf("%dsdld",6n,61,sw)--3;)tEQ\*jc3\*hps22\o\al(\s\up7(ect),or)EQ\*jc3\*hps22\o\al(\s\up7(<),n)EQ\*jc3\*hps22\o\al(\s\up7(s),,)EQ\*jc3\*hps15\o\al(\s\up8(if),d)EQ\*jc3\*hps15\o\al(\s\up8(·2),u)EQ\*jc3\*hps15\o\al(\s\up8(<-),b)continue;xw-sqrt({double)r·r-W2*w2),a-P-xw;EQ\*jc3\*hps15\o\al(\s\up9(」),s)ort(segs.begin(),segs.end(printf("\d\n",solve(segs,len1算法分析請參考:《算法競賽入門經(jīng)典(第2版)》8.4.2節(jié)區(qū)間覆蓋問題EQ\*jc3\*hps15\o\al(\s\up6(注意),同類)EQ\*jc3\*hps15\o\al(\s\up6(使用dcmp),Cleanin)EQ\*jc3\*hps15\o\al(\s\up6(浮點數(shù)),Shifts)EQ\*jc3\*hps15\o\al(\s\up6(做),,P)EQ\*jc3\*hps15\o\al(\s\up6(比),O)EQ\*jc3\*hps15\o\al(\s\up6(較),J)2EQ\*jc3\*hps15\o\al(\s\up6(避免),376)了浮點誤差returnj>x.j;//運算符重載,不要忘記const修飾符)ios::sync_with_stdio(falEQ\*jc3\*hps25\o\al(\s\up11(ect),or)EQ\*jc3\*hps25\o\al(\s\up11(<Jo),nt)EQ\*jc3\*hps25\o\al(\s\up4(sor),int)EQ\*jc3\*hps25\o\al(\s\up4(v.b),an)EQ\*jc3\*hps25\o\al(\s\up4(e),s)EQ\*jc3\*hps25\o\al(\s\up4(n),0)//當(dāng)前任務(wù)的開始執(zhí)行時間//任務(wù)執(zhí)行完畢時的最晚時間)))算法分析請參考:《算法競賽入門經(jīng)典——訓(xùn)練指南》升級版1.1節(jié)例題2表2-2貪心算法例題歸納貪心陳鋒例2-11貪心;選擇不相交區(qū)間陳鋒例2-12貪心:區(qū)間選點陳鋒例2-13陳鋒貪心法求最優(yōu)排列陳鋒2.3搜索算法(字典順序)列出,如=3時,列出{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},例如,F(xiàn)3,k=2給出排列{2,3,1},則它的下一個排列為{3,1,2},下2個排列為//陳鋒EQ\*jc3\*hps25\o\al(\s\up9(s),f)EQ\*jc3\*hps25\o\al(\s\up9(8),t)dEQ\*jc3\*hps25\o\al(\s\up9(8),1)EQ\*jc3\*hps25\o\al(\s\up9(n),1)EQ\*jc3\*hps25\o\al(\s\up9(K),n)for(inti=0;i<K;i++)next_perfor(inti=0;i<n;++i))}算法分析請參考:《算法競賽入門經(jīng)典(第2版)》7.2.1節(jié)生成1~n的排列//陳鋒while(next_permutation(s.begin(),s.)【代碼實現(xiàn)】例2-17【BFS搜索最短路徑】Abbott的復(fù)仇(Abbott’sRevenge,ACM/ICPCWF有一個最多包含9×9個交叉點的迷宮。輸入起點、離開起點時的朝向和終點,求一條最短路徑(多解時任意輸出一個即可)。這個迷宮的特殊之處在于:進入一個交叉點的方向(用N、E、W、S這4個字母分別表示北、東、西、南,即上、右、左、下)不同,允許出去的方向也不同。例如,“12WLFNRER*”表示交叉點(1,2)(上數(shù)第1行,左數(shù)第2列)有3個路標(字符“*”只是結(jié)束標志)。如果進入該交叉點時的朝向為W(即朝左),則可以左轉(zhuǎn)(L)或者直行(F);如果進入時朝向為N或者E,則只能右轉(zhuǎn)(R),如圖2-3所示。圖2-3迷宮及走向例如,圖2-3中從交叉口(3,1)進入并到達目標交叉口(3,3)的一條最短路徑為(3,1),intr,c,dir;//站在(r,c),面朝方向dir(0~3分別表示N,E,S,W)Node(intr=0,intc=0,intEQ\*jc3\*hps19\o\al(\s\up7(,0),旋)EQ\*jc3\*hps19\o\al(\s\up7(-1};),轉(zhuǎn))Nodep[NN][NN][4];intdir_id(charc)freturnstrchr(dirs,c)-dirs;)if(turn==1)dir=(dir+3)64;//逆時針if(turn==2)dir=(dir+1)84;//順時針returnNode(u.r+dr[dir],u.c+dc[dir],dir);}boolboolr,intc)(returnr>=166r<=966c>=166c<=9;if(scanf("8s8d8d%s&did",s,6r0,6c0,s2,6r2,6c2)!-6)returnfalse;【代碼實現(xiàn)】EQ\*jc3\*hps32\o\al(\s\up8(ri),ir)EQ\*jc3\*hps32\o\al(\s\up8(tf),d)EQ\*jc3\*hps32\o\al(\s\up8(n"),s2)EQ\*jc3\*hps32\o\al(\s\up6(s),0),r1=r0+dr[dir],cl-c0+dc[dir];memset(has_edge,0,sizeof(has_edge));EQ\*jc3\*hps26\o\al(\s\up7(whi),for)EQ\*jc3\*hps26\o\al(\s\up7(e),s)EQ\*jc3\*hps26\o\al(\s\up7(f),t)EQ\*jc3\*hps26\o\al(\s\up7(s),1)EQ\*jc3\*hps26\o\al(\s\up7(s),1)EQ\*jc3\*hps26\o\al(\s\up7(1),s)EQ\*jc3\*hps26\o\al(\s\up7(6s),trl)has_edge[r][e][dir_id(s[0])][turn_id(s[i])))//從目標結(jié)點逆序追溯到初始結(jié)點if(d[u.r][u.c][u.dir]=)nodes.push_back(Node(r0,c0,dEQ\*jc3\*hps26\o\al(\s\up5(f),i)EQ\*jc3\*hps26\o\al(\s\up5(-),f)EQ\*jc3\*hps26\o\al(\s\up5(o),")printf("(8d,td)",nodes[1],r,nodes[1].))EQ\*jc3\*hps18\o\al(\s\up9(N),d)EQ\*jc3\*hps18\o\al(\s\up9(de),u)EQ\*jc3\*hps18\o\al(\s\up9(u),u)EQ\*jc3\*hps18\o\al(\s\up9(1),r)ir);Nodeu-q,front();EQ\*jc3\*hps26\o\al(\s\up8(o),u)EQ\*jc3\*hps18\o\al(\s\up11(No),if)EQ\*jc3\*hps18\o\al(\s\up11(e),h)EQ\*jc3\*hps18\o\al(\s\up11(v),e)EQ\*jc3\*hps18\o\al(\s\up11(w),u)EQ\*jc3\*hps18\o\al(\s\up11(lk),r)EQ\*jc3\*hps34\o\al(\s\up4(d),p)EQ\*jc3\*hps34\o\al(\s\up4(v),v)EQ\*jc3\*hps34\o\al(\s\up4(.),.)EQ\*jc3\*hps34\o\al(\s\up4(r),r)EQ\*jc3\*hps34\o\al(\s\up4(v),v)EQ\*jc3\*hps34\o\al(\s\up4(.),.)EQ\*jc3\*hps34\o\al(\s\up4(c),c)EQ\*jc3\*hps34\o\al(\s\up4(v),v)EQ\*jc3\*hps34\o\al(\s\up4(.),.)EQ\*jc3\*hps34\o\al(\s\up4(d),d)EQ\*jc3\*hps34\o\al(\s\up4(i),i)EQ\*jc3\*hps34\o\al(\s\up4(r),r)EQ\*jc3\*hps34\o\al(\s\up4(d),u)EQ\*jc3\*hps34\o\al(\s\up4([),;)一)puts("NoSolutionPossible");1while(read_case())sol)算法分析請參考:《算法競賽入門經(jīng)典(第2版)》例題6-14注意:本題中通過對4個方向統(tǒng)一編碼,減少了大量的分支判斷代碼例2-18【BFS;路徑查找優(yōu)化】萬圣節(jié)后的早晨(TheMorningafterHalloween,圖2-4題設(shè)局面圖2-54種移動方式#define_for(1,a,b)for(inti=(a);1<(int)(b);++i)typedeflonglongLL;constintDX[]*{-1,1,0,0,0},DY[]-{0,0,-1,intW,H,N,V,ID[16][16],X[MAXV],Y[MAXV];intD[MAXV][MAXV][MAXV],Src[3],Dest[3];EQ\*jc3\*hps29\o\al(\s\up3(inli),ass)EQ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論