這題的細節在於一句話:「輸入的內容包含小寫字母、英文句號、退格符」。如此一來就是在告訴咱們「範文」也有可能存在退格符!html
而後就須要對帶有退格符的字符串進行解析,這是這題算法的關鍵!ios
若是有一個退格就刪去距離該退格最近的字符,這一點用過office的同窗應該都很瞭解!那麼若是有多個退格呢?就須要把距離該退格最近的多個字符全刪除!如何描述這個過程呢?很明顯,距離該退格最近的字符是後加入的,卻要最早刪除就是先排出。那麼這樣看就是很明顯的「棧」結構!因此這題用棧去模擬就很Easy!算法
#include <iostream> #include <string> #include <vector> #include <stack> #include <algorithm> using namespace std; using ui = unsigned int; string process(string str) { ui nlen = str.size(); string ret = ""; stack<char> stk; for (ui i = 0; i < nlen; ) { if ('<' != str[i]) { stk.push(str[i]); ++i; } else { if (!stk.empty()) { while (i < nlen && '<' == str[i] && !stk.empty()) { stk.pop(); ++i; } } else { ++i; } } } while (!stk.empty()) { ret += stk.top(); stk.pop(); } reverse(ret.begin(), ret.end()); return ret; } int main() { vector<string> vec; string curStr; while (getline(cin, curStr) && "EOF" != curStr) { curStr = process(curStr); vec.push_back(curStr); } int j = 0, cnt = 0, times, ans; while (getline(cin, curStr) && "EOF" != curStr) { curStr = process(curStr); string modelStr = vec[j]; ui nlen = (curStr.size() < modelStr.size()) ? curStr.size() : modelStr.size(); for (ui i = 0; i < nlen; ++i) { if (modelStr[i] == curStr[i]) { ++cnt; } } ++j; } cin >> times; ans = (int)(cnt * 60.0 / times + 0.5); cout << ans << endl; return 0; }
四捨五入在數據的處理裏是很常見的問題,如今C十一、C++11都有響應的函數去處理。可是咱們也不能忘記最初的處理方式:markdown
(1)四捨五入到整數:ide
ans = (int)(ans + 0.5)
由於int強制類型轉換是向下取整的,因此若是是大於等於0.5的小數部分在加上0.5後進位,而後向下取整就獲得「四捨五入」的結果了!函數
(2)四捨五入到1位小數:ui
ans = (int)(ans * 10 + 0.5) * 0.1
(3)四捨五入到2位小數:atom
ans = (int)(ans * 100 + 0.5) * 0.01
(3)四捨五入到N位小數:
a n s = ( i n t ) ( x ∗ 1 0 n + 0.5 ) ∗ 1 0 − n ans = (int)(x*10^n+0.5)*10^{-n} ans=(int)(x∗10n+0.5)∗10−nspa