当前位置:主页 > 查看内容

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

发布时间:2021-08-20 00:00| 位朋友查看

简介:一道很不错的细节模拟题洛谷P5587 打字练习 题目描述 题目链接 P5585-打字练习 算法分析与实现 这题的细节在于一句话“输入的内容包含小写字母、英文句号、退格符”。如此一来就是在告诉我们“范文”也有可能存在退格符 然后就需要对带有退格符的字符串进行……

一道很不错的细节模拟题:洛谷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://blog.csdn.net/qq_44274276/article/details/115875605
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐