洛谷P3952 時間複雜度

2022-09-07 10:42:13 字數 3024 閱讀 8198

小明正在學習一種新的程式語言 a++,剛學會迴圈語句的他激動地寫了好多程式並 給出了他自己算出的時間複雜度,可他的程式設計老師實在不想乙個乙個檢查小明的程式, 於是你的機會來啦!下面請你編寫程式來判斷小明對他的每個程式給出的時間複雜度是否正確。

a++語言的迴圈結構如下:

f i x y

迴圈體e

其中f i x y表示新建變數 ii(變數 ii 不可與未被銷毀的變數重名)並初始化為 xx, 然後判斷 ii 和 yy 的大小關係,若 ii 小於等於 yy 則進入迴圈,否則不進入。每次迴圈結束後 ii 都會被修改成 i +1i+1,一旦 ii 大於 yy終止迴圈。

xx 和 yy 可以是正整數(xx 和 yy 的大小關係不定)或變數 nn。nn 是乙個表示資料規模的變數,在時間複雜度計算中需保留該變數而不能將其視為常數,該數遠大於 100100。

「e」表示迴圈體結束。迴圈體結束時,這個迴圈體新建的變數也被銷毀。

注:本題中為了書寫方便,在描述複雜度時,使用大寫英文本母「o」表示通常意義下「θ」的概念。

輸入檔案第一行乙個正整數 tt,表示有 tt(t \le 10t≤10)個程式需要計算時間複雜度。 每個程式我們只需抽取其中f i x ye即可計算時間複雜度。注意:迴圈結構 允許巢狀。

接下來每個程式的第一行包含乙個正整數 ll 和乙個字串,ll 代表程式行數,字元 串表示這個程式的複雜度,o(1)表示常數複雜度,o(n^w)表示複雜度為n^wnw,其 中w是乙個小於100的正整數(輸入中不包含引號),輸入保證複雜度只有o(1)o(n^w)兩種型別。

接下來 ll 行代表程式中迴圈結構中的f i x y或者e。 程式行若以f開頭,表示進入乙個迴圈,之後有空格分離的三個字元(串)i x y, 其中 ii 是乙個小寫字母(保證不為nn),表示新建的變數名,xx 和 yy 可能是正整數或 nn ,已知若為正整數則一定小於 100。

程式行若以e開頭,則表示迴圈體結束。

輸出檔案共 tt 行,對應輸入的 tt 個程式,每行輸出yesno或者err(輸出中不包含引號),若程式實際複雜度與輸入給出的複雜度一致則輸出yes,不一致則輸出no,若程式有語法錯誤(其中語法錯誤只有: ① f 和 e 不匹配 ②新建的變數與已經存在但未被銷毀的變數重複兩種情況),則輸出err

注意:即使在程式不會執行的迴圈體**現了語法錯誤也會編譯錯誤,要輸出err

//將數字記為k

輸入的格式有三種:

k o(n^k)

f i x y

e第二種由於不會出現以變數作為x,y的值,如:

f i 1 n

f j i+1 n

則沒有必要儲存各個變數的值,只關心**是否合法和時間複雜度就行了。

對於時間複雜度:

f i k k = f i n k = o(1)

只有 f i k n = o(n) 

則也沒有必要儲存k的值,只須關注x,y是否等於n和迴圈成立即可。

剩下的就是模擬。

#include#include

#include

using

namespace

std;

stack

q;char st[105

];bool fnd(char

a);void

mfnd();

intmain()

else

cin>>a>>ans>>a;

for(int u=1;u<=kline;u++)

cin>>ai>>aj;

now++;

if(aj=="

n"&&ai!="n"

)

else

q.push(0);

if((ai>aj&&ai.size()>=aj.size())||(ai=="

n"&&aj!="n"

))//判斷迴圈是否能執行

zerr++;

if((nans>fans)&&(zerr==0

)) fans=nans;

}else

if(a=='e'

)

if(q.top()==1

) nans--;

q.pop();

if(now==0

) }}

}if(reerr)

cout

<<"

err"

if(now!=0&&err!=1

) cout

<<"

err"

if(fans==ans&&err!=1

) cout

<<"

yes"

if(fans!=ans&&err!=1

) cout

<<"no"

<}

system(

"pause");

return0;

}bool fnd(char

a) i=0

;

while(st[i]!=0

) i++;

st[i]=a;

return0;

}void

mfnd()

其實洛谷的資料還挺水的,沒有出現在迴圈中彈出的操作,都是所有迴圈結束後一次性彈出。

洛谷P3952 時間複雜度

題目描述 小明正在學習一種新的程式語言 a 剛學會迴圈語句的他激動地寫了好多程式並 給出了他自己算出的時間複雜度,可他的程式設計老師實在不想乙個乙個檢查小明的程式,於是你的機會來啦!下面請你編寫程式來判斷小明對他的每個程式給出的時間複雜度是否正確。a 語言的迴圈結構如下 f i x y 迴圈體e其中...

洛谷P3952 時間複雜度 模擬

題目鏈結 咕了一年的題解。就是個模擬吧 考場上寫的遞迴也是醉了。感覺一年自己進步了不少啊。面向資料程式設計的能力提高了不少 include define fi first define se second define mp make pair using namespace std const i...

洛谷 P3952 時間複雜度 模擬

這個模擬,注意每次進入迴圈的時候把新狀態全部入棧,退出迴圈的時候就退棧。第一次就錯在發現err退出太及時,把剩餘的資訊留在流裡面。includeusing namespace std typedef long long ll void solve 變數進棧的順序 stackchs 被占用的變數的標記...