题目:
https://www.luogu.com.cn/problem/P5587
题目描述
R 君在练习打字。
有这样一个打字练习网站,给定一个范文和输入框,会根据你的输入计算准确率和打字速度。可以输入的字符有小写字母、空格和 .
(英文句号),输入字符后,光标也会跟着移动。
输入的文本有多行,R 君可以通过换行键来换行,换行后光标移动到下一行的开头。
R 君也可以按退格键(为了方便,退格键用 <
表示),以删除上一个打的字符,并将光标回移一格。特殊的,如果此时光标已经在一行的开头,则不能继续退格(即忽略此时输入的退格键)。
网站的比较方式遵循以下两个原则:
- 逐行比较,即对于范文和输入的每一行依次比较,不同行之间不会产生影响,多余的行会被忽略。
- 逐位比较,即对于两行的每一个字符依次比较,当且仅当字符相同时才会被算作一次正确,否则会被算作错误。计算答案时,只统计相同的字符个数。
需要注意的是,回车键不会被计入正确的字符个数。
R 君看到网站上显示他花了 T 秒完成了这次的打字游戏,请你计算出他的 KPM(Keys per minutes,每分钟输入的字符个数),答案四舍五入保留整数部分。
输入格式
R 君会依次告诉你网站的范文,他的输入和花费的时间。
其中范文和输入将会这样读入:给定若干行字符串,以单独的一行 EOF
结束,其中 EOF
不算入输入的文本。
最后一行一个整数 T,表示他打字花费了 T 秒。
可以参考样例输入输出文件和样例解释辅助理解。
输出格式
一行一个整数,表示 KPM。
思路:
1.处理好输入问题
2.处理好退行格函数,!!网站的范文也会有退行格,所以作者和网站范文都要处理退行格的问题。
3.比较字符串的时候,长度应取最小长度,不然会防止数组越界。
4.输出是每分钟输入的字符个数,答案四舍五入保留整数部分。
注释我写的很清楚
代码如下:
#include <iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
double T;
string line1[10005];
string line2[10005];
string delstr(string s)//退行函数
{
while (true)
{
int pos = s.find('<');
if(pos == string :: npos)
{
break;
}
else
{
if(pos > 0)
{
s.erase(pos-1,2);
}
else
{
s.erase(pos,1);
}
}
}
return s;
}
int compare(string s1,string s2)
{
s1 = delstr(s1);//处理删除退格键的字符串
s2 = delstr(s2);//处理删除退格键的字符串
int cnt = 0;
for(int i = 0 ; i < min(s1.size(),s2.size()) ; i++)//这里使用min是因为如果两个字符串长度不一致,可能会导致其中一个字符串越界问题。
{
if(s1[i] == s2[i])
{
cnt++;
}
}
return cnt;
}
int main(void)
{
string s;
int len1 = 0,len2 = 0;//记录网文和作者打的行数
while(1)
{
getline(cin,s);
if(s == "EOF")
break;
line1[len1++] = s;
}
while(1)
{
getline(cin,s);
if(s == "EOF")
break;
line2[len2++] = s;
}
cin >> T;//秒
double sum = 0;
int KPM;
for(int i = 0 ; i < len1 ; i++)
{
sum = sum + compare(line1[i],line2[i]);//比较每行的正确字符
}
KPM = int((sum/T)*60 + 0.5);//+0.5取整就是四舍五入
cout << KPM << endl;
return 0;
}