P1042 [NOIP2003 普及组] 乒乓球 JAVA题解

P1042 [NOIP2003 普及组] 乒乓球 JAVA题解

(解决字符串中含有换行,后续数据丢失问题)

题目:具体见洛谷(点击跳转)
题解:

一、理解题意:

1.取胜条件(&&关系):

  • 根据11分制(21分制),那方先赢11分(21)分,即赢下第一回合,输出总比分,如11:10
  • 比分差距大于等于2,一局结束。即若双方11:10,则改局未结束,直至一方比分大于等于另一方2分

2.结束关键:

  • 输出’E’时,结束比赛,无论后续有误数据,丢弃
  • 在识别’E’前,换行符仅当字符,不当输入结束条件(重点,具体见第二点)

二、解题关键:

1.输入判断:scanner.hasNextLine()或has.Next()

  • hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,否则返回false
  • hasNextLine() 方法会根据行匹配模式去判断接下来是否有一行(包括空行),如果有,则返回true,否则返回false

2.存储方式:char [] s= new char[100000];(尽可能大一点)

  • 将输入字符串转换成字符数组:for(char ch:c.toCharArray){}具体见代码

  • 注意跳出外层循环,恢复换行符常规功能

三、代码
import java.util.Scanner;
public class Main{
    static char [] c=new char[100000];
    static int i=0;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        // 判断是否还有数据,即使换行符失效
        while(sc.hasNextLine()){
            String s=sc.nextLine();
            // 将字符串转化为字符数组
            for(char ch:s.toCharArray()){
                if(ch=='E'){
                    c[i]='E';// 赋值,后面跳出外层循环
                    break;
                }
                if(ch=='W'||ch=='L'){
                    c[i++]=ch;
                }
            }
            if(c[i]=='E')
                break;
        }
        show(11);
        System.out.println();
        show(21);
    }
    public static void show(int n) {
        int a=0,b=0;
        for(int j=0;j<i;j++){
            if(c[j]=='W'){
                a++;
            }else b++;
            if((a>=n||b>=n)&&Math.abs(a-b)>=2){
                System.out.println(a+":"+b);
                a=0;// 一局结束,重新赋值
                b=0;
            }
        }
        System.out.println(a+":"+b);// 不满一局的比分
    }
}

你可能感兴趣的:(java,算法)