洛谷 P5587 打字练习 C语言

发布于:2024-12-18 ⋅ 阅读:(129) ⋅ 点赞:(0)

题目:

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;
}


网站公告

今日签到

点亮在社区的每一天
去签到