P5587 打字练习
题目描述
R 君在练习打字。
有这样一个打字练习网站,给定一个范文和输入框,会根据你的输入计算准确率和打字速度。可以输入的字符有小写字母、空格和 .(英文句号),输入字符后,光标也会跟着移动。
输入的文本有多行,R 君可以通过换行键来换行,换行后光标移动到下一行的开头。
R 君也可以按退格键(为了方便,退格键用 < 表示),以删除上一个打的字符,并将光标回移一格。特殊的,如果此时光标已经在一行的开头,则不能继续退格(即忽略此时输入的退格键)。
网站的比较方式遵循以下两个原则:
- 逐行比较,即对于范文和输入的每一行依次比较,不同行之间不会产生影响,多余的行会被忽略。
- 逐位比较,即对于两行的每一个字符依次比较,当且仅当字符相同时才会被算作一次正确,否则会被算作错误。计算答案时,只统计相同的字符个数。
需要注意的是,回车键不会被计入正确的字符个数。
R 君看到网站上显示他花了 TTT 秒完成了这次的打字游戏,请你计算出他的 KPM(Keys per minutes,每分钟输入的字符个数),答案四舍五入保留整数部分。
输出格式
一行一个整数,表示 KPM。
输入输出样例 #1
输入 #1
hello world.
aaabbbb
x
EOF
heelo world.
aaacbbbb
y<x
EOF
60
输出 #1
18
解题思路
这个模拟也是没有太多好说的,主要还是语法的熟悉,同时想到string也是vector类,可以做stl的push和pop函数(当作栈用于退格)即可。另外一点就是一些细节,比如输入中也可能有退格符,然后条件判断细节:j<min(a[n].size(), b[n].size()),四舍五入细节(int)((count * 60.0) / time + 0.5);,可以积累一下。
AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<string> a;
vector<string> b;
string line;
char ch;
int n = 0;
int count = 0;
int time;
int kpm;
while(getline(cin, line), line!="EOF"){
string s;
for(char i: line){
if(i=='<'){
if(!s.empty()){
s.pop_back();
}
}
else{
s.push_back(i);
}
}
a.push_back(s);
}
while(getline(cin, line), line!="EOF"){
string s;
for(char i: line){
if(i=='<'){
if(!s.empty()){
s.pop_back();
}
}
else{
s.push_back(i);
}
}
b.push_back(s);
int count1 = 0;
for(int j = 0;j<min(a[n].size(), b[n].size());j++)
{
if(a[n][j]==b[n][j]){
count1 += 1;
}
else{
continue;
}
}
count += count1;
n += 1;
}
cin >> time;
cout << (int)((count * 60.0) / time + 0.5);
}
1083

被折叠的 条评论
为什么被折叠?



