admin管理员组文章数量:1621658
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 Main {
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快速输入输出使用详解
PAT - 乙级 - 题解集
版权声明:本文标题:1018 锤子剪刀布 (20分)(Java 题解) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728850350a1176597.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论