T1096
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小 AA 和小 BB 正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小 AA 和小 BB 比了 NN 轮之后,谁赢的轮数多?
解析:arrayA 记录小A出拳的规律,arrayB 记录小B出拳的规律,arrayResult 记录不同情况下 AB出拳A的输赢情况,1 表示A赢 -1 表示A输
每轮都对 arrayA,arrayB取模值,查询在 arrayResult 中的结果,最后对结果进行分类处理,输出最后结果
package com.java3.ch2;
import java.util.Arrays;
import java.util.Scanner;
public class T1096 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();//比较N轮
int NA = scan.nextInt();//A出拳的周期长度
int NB = scan.nextInt();//B出拳的周期长度
int[] arrayA = new int[NA];//记录小A出拳的规律
int[] arrayB = new int[NB];//记录小B出拳的规律
for(int i = 0;i < arrayA.length;i++) {
arrayA[i] = scan.nextInt();
}
for(int i = 0;i < arrayB.length;i++) {
arrayB[i] = scan.nextInt();
}
//测试数据接收
//System.out.println("A出拳:" + Arrays.toString(arrayA));
//System.out.println("B出拳:" + Arrays.toString(arrayB));
//arrayResult 记录不同情况下 AB出拳的输赢情况
//1 表示A赢 -1 表示A输
int[][] arrayResult = new int[6][6];
arrayResult[0][5] = -1;
arrayResult[0][2] = 1;
arrayResult[5][0] = 1;
arrayResult[5][2] = -1;
arrayResult[2][0] = -1;
arrayResult[2][5] = 1;
//记录A赢的次数
int isAWin = 0;
for(int i = 0;i < N;i++) {
int A = arrayA[i % NA];
int B = arrayB[i % NB];
isAWin += arrayResult[A][B];
}
//System.out.println(isAWin);
if(isAWin == 0) {
System.out.println("draw");
}else if(isAWin > 0) {
System.out.println("A");
}else {
System.out.println("B");
}
}
}
10 3 4
0 2 5
0 5 0 2
A
T1560
蒜头君手上有个长度为 n 的数组 A。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 x 是否在数组 A 中
解析:主要是使用二分查找算法,数组A使用 int 型的 arrayA存储 ,并且需要进行排序,需要查询的m个元素使用 int 型的 arraySearch 存储
package com.java3.ch2;
import java.util.Arrays;
import java.util.Scanner;
public class T1560 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int[] arrayA = new int[n];
int[] arraySearch = new int[m];
for(int i = 0; i < arrayA.length;i++){
arrayA[i] = scan.nextInt();
}
for(int i = 0; i < arraySearch.length;i++){
arraySearch[i] = scan.nextInt();
}
//测试数据接收
//System.out.println("arrayA : " + Arrays.toString(arrayA));
//System.out.println("arraySearch : " + Arrays.toString(arraySearch));
//对数组A进行排序 从小到大 sort()方法无返回值
Arrays.sort(arrayA);
for(int i = 0;i < arraySearch.length;i++){
int isFlag = binarySearch(arrayA,arraySearch[i]);
if(isFlag == -1){
System.out.println("NO");
}else{
System.out.println("YES");
}
}
}
public static int binarySearch(int[] srcArray,int des){
//定义初始最小,最大索引
int start = 0;
int end = srcArray.length - 1;
//排除特殊情况
if(des < srcArray[start] || des > srcArray[end] || start > end){
return -1;
}
while(start <= end){
//防止溢出
int mid = start + (end - start) / 2 ;
if(des == srcArray[mid]){
return mid;
}else if(des < srcArray[mid]){
//关键字小于中间值 则关键字在左半区域
end = mid - 1 ;
}else{
//关键字大于中间值 则关键字在右半区域
start = mid + 1;
}
}
//查找失败 返回-1
return -1;
}
}
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
NO
YES
NO
YES
NO
T1135
输入两个 n 行 m 列的矩阵 A和 B,输出它们的和 A+B
解析:使用二维数组存储矩阵A和B,对应位置元素相加,并输出即可
package com.java3.ch2;
import java.util.Scanner;
public class T1135 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int[][] arrayA = new int[n][m];
int[][] arrayB = new int[n][m];
int[][] arrayAB = new int[n][m];
for(int i = 0;i < n;i++) {
for(int j = 0;j<m;j++) {
arrayA[i][j] = scan.nextInt();
}
}
for(int i = 0;i < n;i++) {
for(int j = 0;j<m;j++) {
arrayB[i][j] = scan.nextInt();
}
}
for(int i = 0;i < n;i++) {
for(int j = 0;j<m;j++) {
arrayAB[i][j] = arrayA[i][j] + arrayB[i][j];
}
}
for(int i = 0;i < n;i++) {
for(int j = 0;j<m;j++) {
System.out.print(arrayAB[i][j] + " ");
}
System.out.println();
}
}
}
3 3
1 2 3
1 2 3
1 2 3
1 2 3
4 5 6
7 8 9
2 4 6
5 7 9
8 10 12