挑戰程式設計競賽筆記 準備篇和窮舉

2021-09-21 14:28:19 字數 1635 閱讀 5705

1.1 oj結果:

accepted :通過用例

time limit exceed :超時

runtime error: 程式非法訪問記憶體或未處理異常

memory limit exceeded: 記憶體超限

presentation error: 輸出的內容對的,但是格式不符合

output limit exceeded : 輸出過多內容

compile error 未能編譯

1.2 執行時間

對於乙個限制時間為1秒的題目,我們要估計演算法的複雜度。並將數值可能最大的值帶入其中

如:n²的複雜度,若n≤1000,則平方為 1000 000 .

在1秒的限制時間內完成:

1000000 游刃有餘

10000000 勉勉強強

100000000 幾乎不可能

2.1.1 棧
#include可以直接呼叫c++自帶的棧庫

stacks 使用模板類來進行宣告。

s.push(3) 向棧中推進int 3.

s.pop()是推出。但是並不返回值

s.top()才是返回值。

2.1.2 佇列
#includequeue可以宣告

需要注意的是,queue.front()才是返回隊首的值,而pop也是將其推出。

2.1.3 深度優先搜尋dfs

下面這道題是乙個判斷農田水窪數目的題。

由於最近的降雨,水匯集在farmer john's田地的不同地方,其由n×m(1 <= n <= 100; 1 <= m <= 100)的正方形矩形表示。每個方塊包含水('w')或旱地('。')。農夫約翰想弄清楚他的田地裡有多少個池塘。池塘是一組連線的正方形,其中有水,其中乙個正方形被認為與其所有八個鄰居相鄰。 

10 12

w........ww.

.www.....www

....ww...ww.

.........ww.

.........w..

..w......w..

.w.w.....ww.

w.w.w.....w.

.w.w......w.

..w.......w.

最終結果是對每個點至多會有8次迴圈,對於搜尋到的點,都會對其周圍八個點進行搜尋,進行8次迴圈。因此,複雜度小於o(8nm)。

並且,搜尋過的水窪點會被置為』.』。在外部迴圈就不會被再次遍歷。

思路就是,對整個農田進行遍歷,遇到乙個水窪就進行深度搜尋,直到將其相鄰水窪都置為』.』。外部迴圈的每次返回相當於乙個池塘被填平。我們只要記錄池塘被填平的次數就可以了。

#includeint n,m;

int max_n=100;

int max_m=100;

char field[100][100];//田地的大小

void dfs(int x,int y)

}return;

}int main()

for(int i=0;i2.1.6 剪枝

上面所說的窮舉法,可能會因為解空間過大而時間複雜度過高。在判斷過程中,可能會有一些細節能讓我們知道該路徑可以提前結束。從而減少不必要的搜尋活動。

《挑戰程式設計競賽》 演算法初級篇

本系列為 挑戰程式設計競賽 讀書筆記,分為初級篇 中級篇 高階篇 初級篇目錄 窮竭搜尋 貪心 動態規劃 資料結構 圖論 數論 特殊狀態列舉 可行解空間多數可採用dfs,但當其比較特殊時,可簡短地實現 棧記憶體與堆記憶體 所以一般演算法競賽中都使用全域性陣列,開的最大 main函式中的區域性變數儲存在...

《挑戰程式設計競賽》閱讀筆記三

alds1 3 a stack 題目 我就不發了 這是 我抄書的,自己嘗試用stack寫,然後忘了stack怎麼用了 zzz include include include int top,s 105 void push int x int pop int toint char s return r...

挑戰程式設計競賽學習筆記1

const定義的變數值在程式執行過程中不允許發生改變 printf根據格式符輸出對應型別 putchar只能輸出字元 puts可以輸出字串 設計高效且正確的演算法 正確地實現 並且,為了設計演算法,靈活的想象力 演算法的基礎知識 也是必不可少的。程式設計競賽就是以程式設計為主題舉辦的競賽。n個紙片,...