这题的细节在于一句话:“输入的内容包含小写字母、英文句号、退格符”。如此一来就是在告诉咱们“范文”也有可能存在退格符!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