题目链接
题目描述
给定一串由字符 'W' 和 'L' 组成的比赛记录,'W' 表示旺仔哥哥得分,'L' 表示对手得分。你需要分别按照11分制和21分制统计比赛结果。
计分规则(以 分制为例):
- 当一名选手的得分不小于
分,并且双方分差大于等于2分时,该局比赛结束,得分高的选手获胜。
- 如果比赛记录读取完毕时,当前局还未结束,也需要输出当前的比分。
- 新的一局比赛开始时,比分从 0:0 重新计算。
解题思路
本题的核心是模拟计分过程。由于需要分别按11分制和21分制输出结果,我们可以将计分逻辑封装成一个函数,然后用不同的参数(11和21)调用两次即可。
具体步骤如下:
- 定义一个计分函数:创建一个函数,接收两个参数:比赛记录字符串
和赛点分数
(
为11或21)。
- 遍历比赛记录:在函数内部,遍历字符串
的每一个字符。
- 更新比分:
- 维护两个变量,
score1
和score2
,记录当前局的比分。 - 如果字符是 'W',
score1
加1。 - 如果字符是 'L',
score2
加1。
- 维护两个变量,
- 判断当局是否结束:每得一分后,都需要检查比赛是否结束。结束条件是:
- (
score1
或
score2
) 且
abs(score1 - score2)
。
- 如果满足条件,就输出当前的比分
score1:score2
,然后将score1
和score2
都重置为0,准备开始下一局。
- (
- 处理最后一局:当遍历完整个字符串后,当前局可能还未结束。此时,需要输出最后一局的比分。
- 主流程:
- 读取完整的比赛记录字符串。
- 调用计分函数,参数为字符串和11,打印11分制的结果。
- 输出一个空行。
- 调用计分函数,参数为字符串和21,打印21分制的结果。
通过这种方式,我们可以清晰地模拟整个计分流程,并得到正确的结果。
代码
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
// 模拟计分过程的函数
void calculate_score(const string& record, int points) {
int score1 = 0;
int score2 = 0;
for (char ch : record) {
if (ch == 'W') {
score1++;
} else {
score2++;
}
// 判断一局是否结束
if ((score1 >= points || score2 >= points) && abs(score1 - score2) >= 2) {
cout << score1 << ":" << score2 << '\n';
score1 = 0;
score2 = 0;
}
}
// 输出最后一局(可能未结束)的比分
cout << score1 << ":" << score2 << '\n';
}
int main() {
string record;
cin >> record;
calculate_score(record, 11);
cout << '\n';
calculate_score(record, 21);
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String record = sc.next();
calculateScore(record, 11);
System.out.println();
calculateScore(record, 21);
}
// 模拟计分过程的方法
public static void calculateScore(String record, int points) {
int score1 = 0;
int score2 = 0;
for (char ch : record.toCharArray()) {
if (ch == 'W') {
score1++;
} else {
score2++;
}
// 判断一局是否结束
if ((score1 >= points || score2 >= points) && Math.abs(score1 - score2) >= 2) {
System.out.println(score1 + ":" + score2);
score1 = 0;
score2 = 0;
}
}
// 输出最后一局(可能未结束)的比分
System.out.println(score1 + ":" + score2);
}
}
# 模拟计分过程的函数
def calculate_score(record, points):
score1 = 0
score2 = 0
for ch in record:
if ch == 'W':
score1 += 1
else:
score2 += 1
# 判断一局是否结束
if (score1 >= points or score2 >= points) and abs(score1 - score2) >= 2:
print(f"{score1}:{score2}")
score1 = 0
score2 = 0
# 输出最后一局(可能未结束)的比分
print(f"{score1}:{score2}")
record = input()
calculate_score(record, 11)
print()
calculate_score(record, 21)
算法及复杂度
- 算法:模拟
- 时间复杂度:我们需要遍历两次完整的比赛记录字符串,设字符串长度为
。因此,总时间复杂度为
。
- 空间复杂度:我们只使用了常数个变量来记录比分,因此空间复杂度为
。如果考虑存储输入字符串,则总空间复杂度为
。