luogu P3952 時間複雜度 題解

2022-05-05 21:33:08 字數 1510 閱讀 3679

對於2017 d1 t2 這道題

實實在在是個碼力題,非常考驗耐心。

其實大體的思路並不是非常難想出來,但是要注意的小細節比較多。

對於每乙個程式,先讀入l和o(),並將其中的時間複雜度摳出來。

其次整行讀入字串,即所給定的程式。

判斷第乙個字元是f or e

f i x y 需要把x y拿出來,把i壓進棧

e 退棧 壓進i後為了方便退棧及退棧時判斷,用乙個flag標記

每做完乙個程式,與前面摳出來的時間複雜度對比判斷yesnoerr即可。

1.我的readx和ready函式比較暴力,直接擷取常數和n可能存在的位置並儲存。所以在考慮情況時,常數與n的位置不能搞錯,也不能少考慮。

2.在每搞完乙個程式時,要把初始值和標記都初始化一遍。

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7int l,t,anso,codeo;//

anso=0 o(1) anso=x o(n^x) 輸入給的時間複雜度 codeo 自己算的時間複雜度 if anso==codeo yes else no if codeo==-1 err

8string code[105];//

按行輸入所給**(f,e)

9string ans;//

讀入給定的複雜度 o()

10int readx(string

x)11

//摳出給定的複雜度 x

18int ready(string

x)19

//摳出給定的複雜度 y

29int

check1()

30//

記錄輸入給的複雜度

40return

res;41}

42int

check2()

43;//

上面都是便於棧操作,fe來記錄變數名

47int res=0,now=0;//

now來記錄當前迴圈中的時間複雜度,res是整個程式的時間複雜度

48bool cflag[26]=;//

記錄變數是否重複 0 則沒用過 1 用過 changeflag

49int

xnum,ynum;

5051

for(int i=1;i<=l;i++)

5270}71

if(xnum>ynum)

7275}76

77if(code[i][0]=='e'

)7888}

89}

90if(s.size()) return -1;91

return

res;92}

93int

main()

94111

}112

return0;

113 }

P3952 時間複雜度

看到這種又是字串又是模擬的題目就很傷,很多的地方都考驗細節。看到這種處理迴圈的方式是後進先出,自然想到了用棧來模擬。但是最主要的思路是怎麼算複雜度?其實說白了也簡單 乙個迴圈的複雜度 這個迴圈本身的複雜度 在裡面巢狀的最大的複雜度 這裡的每乙個迴圈變數都是不重複的,如果重複直接判err。那麼我們就可...

模擬 洛谷 3952 時間複雜度

給出幾個語句,判斷它們的時間複雜度是否符合,如果是的話輸出 yes 不然輸出 no 編譯錯誤的話輸出 err 比較長的模擬。用乙個check判斷時間複雜度和是否有編譯錯誤,最後比較輸出。include include include include include using namespace s...

題解 LuoGu3952 時間複雜度

原題傳送門 寫的我一口老血 你得先想好 什麼時候會err text err 然後你得知道當前的迴圈到底有沒有用 具體來說是這個迴圈的外面是否有類似 f i 100 1 或 f i n 100 text f i 100 1 或f i n 100 的情況那麼需要乙個記錄外面依然有幾個這樣的迴圈的變數ca...