看到這種又是字串又是模擬的題目就很傷,很多的地方都考驗細節。
看到這種處理迴圈的方式是後進先出,自然想到了用棧來模擬。
但是最主要的思路是怎麼算複雜度?
其實說白了也簡單:乙個迴圈的複雜度 = 這個迴圈本身的複雜度 + 在裡面巢狀的最大的複雜度
這裡的每乙個迴圈變數都是不重複的,如果重複直接判err。
那麼我們就可以用乙個迴圈變數來代表乙個迴圈,利用他們記錄乙個迴圈本身的複雜度和實際的複雜度。
如何計算乙個迴圈的本身時間複雜度?
這裡有乙個很重要的思想:如果乙個迴圈不執行,那麼我就不去考慮這個迴圈內的任何時間複雜度!頂多看看會不會有語法錯誤就好了。
而有乙個挺特殊的情況:如果任何迴圈都不執行的話是\(o(1)\)的。這個在樣例已經跟你說了。
維護的時候直接用乙個數字來維護,意義是\(n\)的幾次方,所以\(o(1)\)用0來代替,不執行的情況我用-1來搞。
err總共有3種情況:
f太多。這個在最後看看棧是不是空的就可以了。
e太多。那麼這個時候會發生棧下溢,特判解決。
變數重名。開乙個used陣列判一下就可以了。
總體來說不難,但是需要你有正確的思路!!!
這個故事告訴我們:寫大模擬的時候一定要先想清楚所有的情況再寫!
說人話就是:
\[\huge
\]**:
#include#include#include#include#include#includeusing namespace std;
string str[105];
bool used[30];
int source[30], comp[30];
int id(char x)
int to_int(string x)
int calc(string x, string y)
else return 1;
}else
}int solve(int len, int expected)
else if(opt[0] == 'e')
else}}
if(!sta.empty()) return 3;// err
if(ans == expected) return 1;
else return 2;
}void print(int res)
int main()
for(int i = 0; i <= len; i++) getline(cin, str[i]);
int res = solve(len, expected);
print(res);
}return 0;
}
洛谷P3952 時間複雜度
題目描述 小明正在學習一種新的程式語言 a 剛學會迴圈語句的他激動地寫了好多程式並 給出了他自己算出的時間複雜度,可他的程式設計老師實在不想乙個乙個檢查小明的程式,於是你的機會來啦!下面請你編寫程式來判斷小明對他的每個程式給出的時間複雜度是否正確。a 語言的迴圈結構如下 f i x y 迴圈體e其中...
洛谷P3952 時間複雜度
小明正在學習一種新的程式語言 a 剛學會迴圈語句的他激動地寫了好多程式並 給出了他自己算出的時間複雜度,可他的程式設計老師實在不想乙個乙個檢查小明的程式,於是你的機會來啦!下面請你編寫程式來判斷小明對他的每個程式給出的時間複雜度是否正確。a 語言的迴圈結構如下 f i x y 迴圈體e其中f i x...
洛谷P3952 時間複雜度 模擬
題目鏈結 咕了一年的題解。就是個模擬吧 考場上寫的遞迴也是醉了。感覺一年自己進步了不少啊。面向資料程式設計的能力提高了不少 include define fi first define se second define mp make pair using namespace std const i...