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

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

題目描述:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題目連接:P5585-打字練習

算法分析與實現

這題的細節在於一句話:「輸入的內容包含小寫字母、英文句號、退格符」。如此一來就是在告訴咱們「範文」也有可能存在退格符!html

而後就須要對帶有退格符的字符串進行解析,這是這題算法的關鍵!ios

若是有一個退格就刪去距離該退格最近的字符,這一點用過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;
}

稍微注意一下「四捨五入」的問題

四捨五入在數據的處理裏是很常見的問題,如今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)(x10n+0.5)10nspa

本題的AC記錄

在這裏插入圖片描述

相關文章
相關標籤/搜索