• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

一道很不错的细节模拟题:洛谷P5587 打字练习

互联网 diligentman 3周前 (04-21) 7次浏览

一道很不错的细节模拟题:洛谷P5587 打字练习

题目描述:

一道很不错的细节模拟题:洛谷P5587 打字练习
一道很不错的细节模拟题:洛谷P5587 打字练习
一道很不错的细节模拟题:洛谷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)(x10n+0.5)10n

本题的AC记录

一道很不错的细节模拟题:洛谷P5587 打字练习


程序员灯塔
转载请注明原文链接:一道很不错的细节模拟题:洛谷P5587 打字练习
喜欢 (0)