




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
上海大學ACM/icpc上海大學ACM/icpc集訓隊 何琪辰2007.3.25#上海大學ACM集訓隊培訓資料(內部使用)一、C++基礎基本知識所有的C++程序都是有函數組成的,函數又叫做子程序,且每個C++程序必須包含一個main函數,編譯器(能夠把源代碼轉換成目標代碼的程序)把翻譯后的目標代碼和一些啟動代碼組合起來,生成可執行文件,main函數就是可執行文件的入口,所以,每個C++程序有且只有一個main函數。下面我們看一個最簡單C++程序。(程序1.1)程序1.1intmain(){return0;}在這個程序中,如果缺少任何一個字符,編譯器就無法將其翻譯成機器代碼。此外,C++是對大小寫敏感的,這就意味著,如果我將mian()函數拼為Main(),哪么,編譯器在編譯這段程序的時候就會出錯。編輯源文件能夠提共管理程序開發的所有步驟,包括編輯的程序成為集成開發環境(integrateddevelopmentevironments,IDE)o在windows系統下,使用較為廣泛的有MicrosoftVisualC++、Dev-Cpp等,在UNIX系統下,有Vim、emacs、eclipes等。這些程序都能提供一個較好的開發平臺,使我們能夠方便的開發一個程序,接下我們所要了解的都是標準C++,所有源代碼都在Dev-cpp下編寫,能夠編譯通過。如果我們修改程序1.1中的main()函數的名稱,將其改為Main(),那么,IDE就會給出錯誤信息,比如“[Linkererror]undefinedreferenceto'WinMain@16'”,因為編譯器沒有找到main函數。接下來,我們來看一個經典的C++例子(程序1.2)程序1.2#include<iostream>usingnamespacestd;intmain(void){cout<<"HelloWrold!"<<endl;return0;}運行結果HelloWorld!程序說明第一行“#include<iostream>",是一句預處理命令,相當于把“iostream”這個文件的所有內容復制到當前位置,替換該行。因為在輸出操作中需要做很多事,C++編譯器就提供了很多已經寫好的函數(成為C++標準庫),我們做的只是拿來用就可以了。第二行的“usingnamespacestd;”是使用標準命名空間,因為我們在程序中用到了在標準命名空間里的函數和對象。目前可以不了解其具體如何實現,在以后的程序設計中可以再對其進行了解。在明函數中"cout<<”HelloWorld!”<<endl;”是在屏幕上打印“HelloWorld!”,“endl”表明打印完這句話之后需要換行。如果我們替換引號內的內容,程序的輸出就會相應改變。另外一個C++程序例子//ourfunc.cpp--definingyourownfunction#include<iostream>voidsimon(int);//functionprototypeforsimon()intmain(){usingnamespacestd;simon(3);//callthesimon()functioncout<<"Pickaninteger:";intcount;cin>>count;simon(count);//callitagaincout<<"Done!"<<endl;return0;}voidsimon(intn)//definethesimon()function{usingnamespacestd;cout<<"Simonsaystouchyourtoes"<<n<<"times."<<endl;} //voidfunctionsdon'tneedreturnstatements下面試運行情況:Simonsaystouchyourtoes3times.Pickaninteger:512Simonsaystouchyourtoes512times.Done!程序中包含了cin語句來從鍵盤上獲取數據。該程序中包含了除main函數以外的另一個函數simon(),他和main函數定義的格式相同,函數的統一格式如下:typefunctionname(argumentlist){statements}注意,定義simon()的代碼在main()函數的后面,C++中不允許將函數定義在另一個函數內。每個函數的定義都是獨立的,所有的函數的創建都是平等的。simon()函數的函數頭定義如下:voidsimon(intn)以void開頭表明simon()沒有返回值,因此我們不能類是這樣的使用它。simple=simon(3);有返回值的函數如下//convert.cpp--convertsstonetopounds#include<iostream>intstonetolb(int);//functionprototypeintmain(){usingnamespacestd;intstone;cout<<"Entertheweightinstone:";cin>>stone;intpounds=stonetolb(stone);cout<<stone<<"stone=";cout<<pounds<<"pounds."<<endl;return0;}intstonetolb(intsts){return14*sts;}下面是運行情況:Entertheweightinsone:1414stone=196pounds.程序通過cin語句給stone提供一個值,然后在main函數中,把這個值傳遞給stonetolb()函數,這個植被賦給sts之后,stonetolb(^return將14*sts返回給main()。函數頭中的int表明stonetolb()將返回一個整數。除了int類型之外,C++的內置數據類型還有:unsignedlong、long、unsignedint>unsignedshort、short、char、unsignedchar、signedchar、bool、 float、double、longdouble。對于數據的輸入和輸出有幾道練習題/showproblem.php?pid=1089至/showproblem.php?pid=1096二、算法基礎什么是算法算法是完成特定任務的有限指令集。所有的算法必須滿足下面的標準:輸入。由外部題共零個或多個輸入量。
輸出。至少產生一個輸出量。明確性。每條指令必須清楚,不具模糊性。有限性。如果跟蹤算法的指令,那么對于所有的情況,算法經過有限步以后終止。有效性。每條指令必須非常基礎,原則上使用筆和紙就可以實現例選擇排序voidSelectionSort(Typea[],intn)//Sortthearrata[1:n]intonondecreasingorder.{for(inti=1;i<=n;i++){intj=1;for(intk=i+1;k<=n;k++)if(a[k]<a[j])j=k;Typet=a[i];a[i]=a[j];a[j]=t;}}使用該函數時,應將Type替換為C++中的數據類型3.性能分析程序P所用時間定義為T(P),T(P)是編譯時間和運行時間之和。下面我們計算一下選擇排序運行時所要花費的時間SelectionSortcostTOC\o"1-5"\h\zfor(inti=1;i<=n;i++) c1{intj=1; c2for(intk=i+1;k<=n;k++) c3if(a[k]<a[j]) c4j=k; c5timesnnZ(n-i)itimesnnZ(n-i)i=1Z(n-i)i=1tin那么該算法運行的時間123i=14i=15i6T(n)=cn+cn+cZ(n-i)+cZ(n123i=14i=15i6那么,在最壞的條件下,t的值應該是Z(n-i)ii=1所以,算法的運行時間為() 1 1 1 1Tm)=(c+c+c——c——c——c)n+—(c+c+c)n21262342425 23454.漸進符號定義:[大0函數f(n)=O(g(n)),念做f(n)是g(n)的大”oh”,當且僅當存在正常數c和n,使得對于所有的n(n>n),有f(n)<cxg(n)。00例對于所有n>2有3n+2<4n,所以3n+2=O(n)。對于所有n>6有100n+6<101n,所以100n+6=O(n)對于所有n>100有1000n2+100n-6<1001n2,所以1000n2+100n-6=O(n2)當然對于所有n>2有100n2+4n+2<10n4,所以10n2+4n+2=O(n4)定義:[0函數f(n)=Q(g(n)),念做f(n)是g(n)的"omega”,當且僅當存在正常數c和n,使得對于所有的n(n>n),有f(n)>cxg(n)。00例對于所有n>1有6x2n+n2>2n,所以6x2n+n2=Q(2n)。當然6x2n+n2=Q(n),但是Q(n)wQ(2n)。現然無論是O還是Q,都不能精確的描述一個函數定義:[日]函數f(n)=0(g(n)),念做f(n)是g(n)的”肥1屋,當且僅當存在正常數c,c12和n,使得對于所有的n(n>n),有cg(n)<f(n)<cg(n)。0 01 2例對于n>2有3n+2>3n且3n+2<4n,所以3n+2=0(n)
0記號要比O和Q都要精確。排列生成器0(n!)voidPerm(Typea[],intk,intn){if(k==n){//Outputpermutation.for(inti-1;i<n;i++)cout<<a[i]<<"";}else//a[k:n]hasmorethanonepermutation.//Generatetheserecursively.for(inti=k;i<=n;i++){Typet=a[k];a[k]=a[i];a[i]=t;Perm(a,k+1,n);//Allpermutationsofa[k+1:n]t=a[k];a[k]=a[i];a[i]=t;}}對于下面的程序}else}else{inti;for(i=0;i<n;i++){cout<<a[i]<<'\t';}cout<<endl;}usingnamespacestd;voidPerm(inta[],intk,intn){if(k<n-1){inti,t;for(i=k;i<n;i++){t=a[k]; }a[k]=a[i];a[i]=t;Perm(a,k+1,n);t=a[k];a[i]=t;Perm(a,k+1,n);t=a[k];a[k]=a[i];a[i]=t;}intmain(void){inta[3]={1,2,3};Perm(a,0,3);return0;}該程序的運行結果為1 2 3該程序的運行結果為1 2 31 3 22 1 32 3 13 2 13 1 2那么,該函數就完成了對一個數組進行全排列的操作下面,分析該程序,我用圓圈代表每次函數的調用每次函數的調用都用序號表示那么,該函數就完成了對一個數組進行全排列的操作下面,分析該程序,我用圓圈代表每次函數的調用每次函數的調用都用序號表示a: 2 1 3 k: 2a: 2 3 1 k: 2a: 2 1 3 k: 2a: 2 3 1 k: 2a: 3 2 1 k: 1a: 3 2 1 k: 2a: 3 1 2 k: 2a: 1 23 k: 1a: 1 23 k: 2a: 1 32 k: 2a: 2 13 k: 1排列生成器的另外一個版本他將輸出給定n個布爾變量的所有可能的組合voidPerm(boola[],intk,intn){if(k==n){//statement}else{a[k]=true;Perm(a,k+1,n);a[k]=false;Perm(a,k+1,n);}}在上次冬季賽上有這么一道題競賽真理JUNNY在經歷了無數次學科競賽的失敗以后,得到了一個真理:做一題就要對一題!但是要完全正確地做對一題是要花很多時間(包括調試時間),而競賽的時間有限。所以開始做題之前最好先認真審題,估計一下每一題如果要完全正確地做出來所需要的時間,然后選擇一些有把握的題目先做。當然,如果做完了預先選擇的題目之后還有時間,但是這些時間又不足以完全解決一道題目,應該把其他的題目用貪心之類的算法隨便做做,爭取“騙”一點分數。根據每一題解題時間的估計值,確定一種做題方案(即哪些題目認真做,哪些題目“騙”分,哪些不做),使能在限定的時間內獲得最高的得分。INPUTFORMAT:從標準輸入(。山恥2比等)讀入數據。數據有多組,先輸入K(K組數據)。每組第一行有兩個正整數N和T,表示題目的總數以及競賽的時限(單位秒)。以下的N行,每行4個正整數W1i、T1i、W2i、T2i,分別表示第i題:完全正確做出來的得分,完全正確做出來所花費的時間(單位:秒),“騙”來的分數,“騙”分所花費的時間(單位秒)。其中,3WNW30,2WTW1080000,1WW1i、W2iW30000,1WT1i、T2iWT。OUTPUTFORMAT:直接把所求得的最高得分輸出。數據之間需換行。SAMPLEINPUT:2410800183600318002240001230002860000300032800024600037200505400109005072001090050540010900SAMPLEOUTPUT:5070下面我們對問題進行簡化。我們只要考慮是做題還是不做題。從標準輸入1畝趾2比等)讀入數據。數據只有一組,先輸入K(K組數據)。每組第一行有兩個正整數N和T,表示題目的總數以及競賽的時限(單位秒)。以下的N行,每行2個正整數Wi、Ti,分別表示第i題:做出來的得分和做出來所花費的時間(單位:秒),OUTPUTFORMAT:直接把所求得的最高得分輸出。數據之間需換行。SAMPLEINPUT:510120510415320210SAMPLEOUTPUT:65下面是用全排列生成器完成的代碼#include<iostream>usingnamespacestd;intm;intt[20][2];inttSum;voidwork(boola[],intn);voidf(boola[],intk,intn){if(k<n){a[k]=true;f(a,k+1,n);a[k]=false;f(a,k+1,n);}else{work(a,n);}}voidwork(boola[],intn){intx;inttime=0,score=0;for(x=0;x<n;x++){if(a[x]){score+=t[x][1];time+=t[x][0];}}if(time<=tSum){if(score>m){m=score;}}}intmain(void){boola[30];intn,c;cin>>n>>tSum;m=0;for(c=0;c<n;c++){cin>>t[c][0];cin>>t[c][1];}f(a,0,n);cout<<m<<endl;return0;}通過一個排列生成器將所有的可能送入work()函數內,然后work函數找到在時間范圍內的最高的分數。現在我們將其優化,將work()和f()合并,就能得到更好的程序#include<iostream>usingnamespacestd;{dfs(k+1,n,cScore,cTime);dfs(k+1,n,cScore+t[k][1],cTimeintm;intt[20][2];inttSum;voiddfs(intk,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 童車類產品安全性能提升技術考核試卷
- 生活初三語文作文600字
- 硅冶煉廠的工藝流程設計考核試卷
- 橡膠制品的品牌形象與品牌推廣策略研究考核試卷
- 玻璃纖維增強塑料的機械性能優化設計考核試卷
- 家電配件的精密加工與測量技術考核試卷
- 小學一年級數學20以內進位、退位加減法口算
- 造口并發癥及處理 2
- 四川成都實驗外國語2023-2024學年高一下學期期中考試數學試題【含答案】
- 血液透析及并發癥護理 2
- 河南省許昌地區2024-2025學年七年級下學期期中素質評估道德與法治試卷(含答案)
- 小學生勞動課件
- 高二下學期《家校攜手凝共識齊心協力創輝煌》家長會
- (二模)滄州市2025屆高三總復習質量監測 生物試卷(含答案詳解)
- 內部審計流程試題及答案
- 2025年北師大版七年級數學下冊計算題專項訓練專題04整式的混合運算與化簡求值(原卷版+解析)
- 2025-2030中國燃料乙醇行業現狀調查及投資前景策略分析研究報告
- 2025年人教版七年級下冊英語全冊教學設計
- 2025浙江1月卷讀后續寫及滿分語料10類40句 (真假小偷) 原卷版
- 餐飲合伙協議合同范本
- 第二單元 人民當家作主(B卷 能力提升)2024-2025學年高中政治統編統編版必修三單元測試AB卷(含解析)
評論
0/150
提交評論