一道很不錯的細節模擬題:洛谷P5587 打字練習
題目描述:



題目鏈接:P5585-打字練習
演算法分析與實作
這題的細節在于一句話:“輸入的內容包含小寫字母、英文句號、退格符”,如此一來就是在告訴我們“范文”也有可能存在退格符!
然后就需要對帶有退格符的字串進行決議,這是這題演算法的關鍵!
如果有一個退格就刪去距離該退格最近的字符,這一點用過office的同學應該都很了解!那么如果有多個退格呢?就需要把距離該退格最近的多個字符全洗掉!如何描述這個程序呢?很明顯,距離該退格最近的字符是后加入的,卻要最先洗掉就是先排出,那么這樣看就是很明顯的“堆疊”結構!所以這題用堆疊去模擬就很Easy!
我的AC代碼
#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;
}
稍微注意一下“四舍五入”的問題
四舍五入在資料的處理里是很常見的問題,現在C11、C++11都有回應的函式去處理,但是我們也不能忘記最初的處理方式:
(1)四舍五入到整數:
ans = (int)(ans + 0.5)
因為int強制型別轉換是向下取整的,所以如果是大于等于0.5的小數部分在加上0.5后進位,然后向下取整就得到“四舍五入”的結果了!
(2)四舍五入到1位小數:
ans = (int)(ans * 10 + 0.5) * 0.1
(3)四舍五入到2位小數:
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?n
本題的AC記錄

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278464.html
標籤:其他
上一篇:線代與計算機圖形(一)
