PAT乙级1018,附题目解析和代码注释

1018 锤子剪刀布 (20分)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mPEAjWgv-1619358972875)(https://uploader.shimo.im/f/SqgVbhlcSVooVgyV.png!thumbnail?fileGuid=9XkkpYK9dCK8twyC)]

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 1 行给出正整数N(≤105

),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

输出格式:

输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
     
    

输出样例:

5 3 2
2 3 5
B B

题目解析:
此题我采用的方法是定义两个数组分别存放甲乙各个手势的胜利次数,最后整个数组所有元素的和就是总的胜利次数,同时定义整型变量ping,记录平的次数,N-胜-平就是负的次数。

此题还有一个问题就是使用Scanner的话最后一个测试点容易超时,所以还是使用BufferedReader避免超时。

AC代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int N=Integer.parseInt(br.readLine());
        int count_jia[]=new int[3];//甲的获胜次数,数组从左到右代表J C B
        /*之所以count_jia[0]代表J获胜次数,count_jia[1]代表C获胜次数,count_jia[2]代表B获胜次数
        * 是因为最后还要统计获胜次数最多的手势,所以需要单独统计每一个手势获胜的次数,还有为什么是J C B
        * 这种排序,是因为如果解不唯一,则输出按字母序最小的解,JCB越往右字典序越小 楼下count_yi数组同理*/
        int count_yi[]=new int[3];
        int ping=0;//记录ping的次数
        for(int i=0;i<N;i++){
            char[] c=br.readLine().toCharArray();
            char jia=c[0];//得到甲手势
            char yi=c[2];//得到乙手势
            if(jia=='C'){//如果甲是C
                if(yi=='C'){//乙也是C,那么就平
                    ping++;
                }else if(yi=='B'){ //如果乙是B,那么乙赢,乙的B手势获胜次数加1
                    // 下面都是一样的道理,都是互相比较决定谁赢,我就不写注释了
                    count_yi[2]++;
                }else{             
                    count_jia[1]++;
                }
            }else if(jia=='B'){
                if(yi=='B'){
                    ping++;
                }else if(yi=='C'){
                    count_jia[2]++;
                }else{
                    count_yi[0]++;
                }
            }else{
                if(yi=='J'){
                    ping++;
                }else if(yi=='B'){
                    count_jia[0]++;
                }else{
                    count_yi[1]++;
                }
            }
        }
        //输出甲胜负平次数
        System.out.println(count_jia[0]+count_jia[1]+count_jia[2]+" "+ping+" "+(N-ping-(count_jia[0]+count_jia[1]+count_jia[2])));
        //输出乙胜负平次数
        System.out.println(count_yi[0]+count_yi[1]+count_yi[2]+" "+ping+" "+(N-ping-(count_yi[0]+count_yi[1]+count_yi[2])));
       
        //找甲胜数次数最多的手势       
        int max=0,index=0;//定义最大值,和最大值的下标
        for(int i=0;i<3;i++){
            if(max<=count_jia[i]){//这里一定得是<=,因为是按JCB排序的
                //如果最后CB个数相同,还要进行比较,因为B是字典序小的
                max=count_jia[i];
                index=i;
            }
        }
        //如果index是0,说明数组下标第一个位置的数最大,是J,CB一个道理
        switch(index){
            case 0:System.out.print("J ");break;
            case 1:System.out.print("C ");break;
            case 2:System.out.print("B ");break;
        }
        //找乙胜数次数最多的手势,和甲的分析方式一样我就不写注释了
        max=0;index=0;
        for(int i=0;i<3;i++){
            if(max<=count_yi[i]){
                max=count_yi[i];
                index=i;
            }
        }
        switch(index){
            case 0:System.out.print("J");break;
            case 1:System.out.print("C");break;
            case 2:System.out.print("B");break;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值