1018 锤子剪刀布 (20分) Java题解 PAT (Basic Level) Practice (中文)

1018 锤子剪刀布 (20分)



原题链接:传送门

一、题目:

在这里插入图片描述

输入样例 1:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例 1:
5 3 2
2 3 5
B B


二、解析:

思路1:

  得出A和B所有手势赢的次数,然后求平局次数后输出。最后的赢的次数最多的手势因为只有三个直接判断就行。

  这题用输入输出和需要快一点,如果最后一个案例还超时就多提交几次。

AC代码1:代码2的优化
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

/**
 * 1018 锤子剪刀布 (20分)
 * 
 * @思路:得出A和B所有手势赢的次数,然后求平局次数后输出。最后的赢的次数最多的手势因为只有三个直接判断就行。
 * @注意:这题用输入输出和需要快一点,如果最后一个案例还超时就多提交两次
 * @author: ChangSheng 
 * @date:   2019年12月30日 下午1:35:46
 */
public class P1018_ac_超时多提交2_优化代码_一直超时____看看看看看看看看看看看看看看 {
	public static void main(String[] args) throws IOException{
		StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out = new PrintWriter(System.out);
		int ABwin = 0, ACwin = 0, AJwin = 0, BBwin = 0, BCwin = 0, BJwin = 0;
		in.nextToken();
		int N = (int)in.nval;
		for (int i = 0; i < N; i++) {
			in.nextToken();
			String A = in.sval;
			in.nextToken();	
			String B = in.sval;
			if (A.equals("B") && B.equals("C")) ABwin++;  // A出布B,B出锤子C,A赢一次
			else if (A.equals("C") && B.equals("J")) ACwin++;
			else if (A.equals("J") && B.equals("B")) AJwin++; 
			else if (B.equals("B") && A.equals("C")) BBwin++; 
			else if (B.equals("C") && A.equals("J")) BCwin++; 
			else if (B.equals("J") && A.equals("B")) BJwin++; 
		}
		int Acount = ABwin + ACwin + AJwin; // A赢的总次数
		int Bcount = BBwin + BCwin + BJwin;
		int PJcount = N - (Acount + Bcount); // 平局的次数:总次数 -( A赢的次数 +- 和B赢的次数)
		out.println(Acount + " " + PJcount + " " + Bcount);
		out.println(Bcount + " " + PJcount + " " + Acount);
		out.print(max(ABwin, ACwin, AJwin) + " " + max(BBwin, BCwin, BJwin));
		out.flush();
	}
	
	/** @return:赢的次数最大手势 */
	public static char max(int B, int C, int J) {
		if (B >= C && B >= J) return 'B'; // 大于等于C和J
		if (C > B && C >= J) return 'C'; // 比B大,且大于等于J
		return 'J';
	}
}
思路2:

  先得出A赢的总次数和B赢的总次数,再得出AB所有手势中赢的最大值次数。按JCB顺序遍历一下找出最大(因为如果次数相同需要打印字母序小的,所以才需要按照JCB遍历)。

  注意:这题用Java会最后一个案例会超时,我思路没问题,然后我多提交两次然后就过了,哭笑
在这里插入图片描述

AC代码2:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

/**
 * 1018 锤子剪刀布 (20分)
 * 
 * @思路:先得出A赢的总次数和B赢的总次数,再得出AB所有手势中赢的最大值次数。
 * 	按JCB顺序遍历一下找出最大(因为如果次数相同需要打印字母序小的,所以才需要按照JCB遍历)。
 * 	注意:这题用Java会最后一个案例会超时,我思路没问题,然后我多提交两次然后就过了,哭笑
 * @author: ChangSheng 
 * @date:   2019年12月30日 下午1:35:46
 */
public class Main {
	public static void main(String[] args) throws IOException{
		StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		int[] Awin = new int[3]; // Awin[0]-是出B赢的次数,Awin[1]-是出C赢的次数,Awin[2]-是出J赢的次数,
		int[] Bwin = new int[3]; // B(乙)用XX赢的次数
		in.nextToken();
		int N = (int)in.nval;
		for (int i = 0; i < N; i++) {
			in.nextToken();
			String A = in.sval;
			in.nextToken();
			String B = in.sval;
			if (A.equals("C")) { // A出C锤子,平局就不判断了
				if (B.equals("J")) Awin[1]++; // A出C锤子赢一次
				else if (B.equals("B")) Bwin[0]++;
			} else if (A.equals("J")) {
				if (B.equals("C")) Bwin[1]++;
				else if (B.equals("B"))Awin[2]++;
			} else if (A.equals("B")) {
				if (B.equals("C")) Awin[0]++;
				else if (B.equals("J")) Bwin[2]++;
			}
		}
		int sumA = Awin[0] + Awin[1] + Awin[2]; // A赢的总次数
		int sumB = Bwin[0] + Bwin[1] + Bwin[2]; // B赢的总次数
		int sumP = N - (sumA + sumB); // 平局的次数:总次数-A和B赢的次数
		System.out.println(sumA + " " + sumP + " " + sumB);
		System.out.println(sumB + " " + sumP + " " + sumA);
		int maxA = 0, maxB = 0; // A和B中所有手势中,赢的最大次数
		for (int i = 0; i < 3; i++) {
			if (Awin[i] > maxA) maxA = Awin[i];
			if (Bwin[i] > maxB) maxB = Bwin[i];
		}
		// 倒序遍历所有次数(如果解不唯一,则输出按字母序最小的解)
		char j = 0, y = 0; // 甲和乙赢的次数最多的手势
		for (int i = 2; i >= 0; i--) {
			if (Awin[i] == maxA) {
				if (i==2) j = 'J';
				if (i==1) j = 'C';
				if (i==0) j = 'B';
			}
			if (Bwin[i] == maxB) {
				if (i==2) y = 'J';
				if (i==1) y = 'C';
				if (i==0) y = 'B';
			}
		}
		System.out.print(j + " " + y);
	}
}

相关链接

Java快速输入输出使用详解

发布了86 篇原创文章 · 获赞 104 · 访问量 6644

猜你喜欢

转载自blog.csdn.net/weixin_44034328/article/details/103785449