题目链接

乒乓球

题目描述

给定一串由字符 'W' 和 'L' 组成的比赛记录,'W' 表示旺仔哥哥得分,'L' 表示对手得分。你需要分别按照11分制和21分制统计比赛结果。

计分规则(以 分制为例):

  1. 当一名选手的得分不小于 分,并且双方分差大于等于2分时,该局比赛结束,得分高的选手获胜。
  2. 如果比赛记录读取完毕时,当前局还未结束,也需要输出当前的比分。
  3. 新的一局比赛开始时,比分从 0:0 重新计算。

解题思路

本题的核心是模拟计分过程。由于需要分别按11分制和21分制输出结果,我们可以将计分逻辑封装成一个函数,然后用不同的参数(11和21)调用两次即可。

具体步骤如下:

  1. 定义一个计分函数:创建一个函数,接收两个参数:比赛记录字符串 和赛点分数 为11或21)。
  2. 遍历比赛记录:在函数内部,遍历字符串 的每一个字符。
  3. 更新比分
    • 维护两个变量,score1score2,记录当前局的比分。
    • 如果字符是 'W',score1 加1。
    • 如果字符是 'L',score2 加1。
  4. 判断当局是否结束:每得一分后,都需要检查比赛是否结束。结束条件是:
    • (score1 score2 ) 且 abs(score1 - score2)
    • 如果满足条件,就输出当前的比分 score1:score2,然后将 score1score2 都重置为0,准备开始下一局。
  5. 处理最后一局:当遍历完整个字符串后,当前局可能还未结束。此时,需要输出最后一局的比分。
  6. 主流程
    • 读取完整的比赛记录字符串。
    • 调用计分函数,参数为字符串和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)

算法及复杂度

  • 算法:模拟
  • 时间复杂度:我们需要遍历两次完整的比赛记录字符串,设字符串长度为 。因此,总时间复杂度为
  • 空间复杂度:我们只使用了常数个变量来记录比分,因此空间复杂度为 。如果考虑存储输入字符串,则总空间复杂度为