首页 > 试题广场 >

乒乓球

[编程题]乒乓球
  • 热度指数:2064 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}旺仔哥哥特别喜欢打乒乓球,有一天他给你一串由字符 \texttt{W}\texttt{L} 组成的比赛记录,\texttt{W} 表示旺仔哥哥得分,\texttt{L} 表示对手得分。

\hspace{15pt}请分别按11 分制21 分制统计比赛结果,并输出每局比分。规则如下:
\hspace{23pt}\bullet\, 当且仅当一局比赛中存在某个选手分数不小于 11(或 21)且双方比分差 \geqq 2 时,判定一局结束,此时得分高的选手获胜;
\hspace{23pt}\bullet\, 若读取结束时当前局未结束,也需输出当前比分;
\hspace{23pt}\bullet\, 新局开始时比分记为 0{:}0

输入描述:
\hspace{15pt}一行一个字符串 s\left( 1 \leqq |s| \leqq 10^5,s_i \in \{\text{W},\text{L}\}\right),表示比赛记录。


输出描述:
\hspace{15pt}输出两部分,每部分若干行,每行为一局的比分,形如 \text{旺仔哥哥的得分}:\text{对手得分},按照记录顺序:
\hspace{23pt}\bullet\, 第一部分为 11 分制结果;
\hspace{23pt}\bullet\, 空行分隔后,第二部分为 21 分制结果。
示例1

输入

WWWWWWWWWWWWWWWWWWWWWWLW

输出

11:0
11:0
1:1

21:0
2:1
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        scanner.close();
        
        // 计算11分制结果
        List<String> result11 = calculateScore(s, 11);
        // 计算21分制结果
        List<String> result21 = calculateScore(s, 21);
        
        // 输出11分制结果
        for (String score : result11) {
            System.out.println(score);
        }
        
        // 空行分隔
        System.out.println();
        
        // 输出21分制结果
        for (String score : result21) {
            System.out.println(score);
        }
    }
    
    /**
     * 根据指定的分制计算比赛结果
     * @param s 比赛记录字符串
     * @param target 分制(11或21)
     * @return 每局比分的列表
     */
    private static List<String> calculateScore(String s, int target) {
        List<String> result = new ArrayList<>();
        int wScore = 0; // 旺仔哥哥的得分
        int lScore = 0; // 对手的得分
        
        for (char c : s.toCharArray()) {
            // 更新得分
            if (c == 'W') {
                wScore++;
            } else {
                lScore++;
            }
            
            // 检查当前局是否结束
            if (isGameOver(wScore, lScore, target)) {
                // 记录本局比分
                result.add(wScore + ":" + lScore);
                // 开始新局,重置分数
                wScore = 0;
                lScore = 0;
            }
        }
        
        // 处理未结束的局&nbs***bsp;新开的局
        if (wScore > 0 || lScore > 0) {
            result.add(wScore + ":" + lScore);
        } else if (wScore == 0 && lScore ==0){
            result.add(0 + ":" + 0);    
        }
        
        return result;
    }
    
    /**
     * 判断当前局是否结束
     * @param w 旺仔哥哥的得分
     * @param l 对手的得分
     * @param target 分制(11或21)
     * @return 若局结束则返回true,否则返回false
     */
    private static boolean isGameOver(int w, int l, int target) {
        // 当且仅当一局比赛中存在某个选手分数不小于target且双方比分差≥2时,判定一局结束
        return (w >= target || l >= target) && Math.abs(w - l) >= 2;
    }
}
    

发表于 2025-08-29 08:50:01 回复(0)