2014年蓝桥杯省赛JavaB题解

真题下载地址

需要2014年蓝桥杯JavaB组真题的可以在评论下留一下邮箱

目录

一、标题:武功秘籍

二、标题:切面条

三、标题:猜字母

四、标题:大衍数列

五、标题:圆周率

六、标题:奇怪的分式

七、标题:扑克序列

八、标题:分糖果

九、 标题:地宫取宝

十、 标题:矩阵翻硬币(难题)


一、标题:武功秘籍

  • 找规律

answer:7

二、标题:切面条

  • 找规律 2^n+1

answer:1025

三、标题:猜字母

  • 数组操作
package _2014JavaB组_48_100;

public class P3另一种解法 {
	public static void main(String[] args) {
		char[] c = new char[2014];
		int index = 0;
		for (int i = 0; i < 106; i++) {
			for (int j = 0; j < 19; j++) {
				c[index++] = (char)('a'+j);
			}
		}
		
		int len = 2014;
		while(len!=1) {
			index = 0;
			for (int i = 1; i < len; i+=2) {
				c[index++] = c[i];
			}
			len = len/2;
		}
		System.out.println(c[0]);
	}
}

answer:q

四、标题:大衍数列

  • 送分

answer:i%2==0

五、标题:圆周率

  • 观察,推导

answer:4/(x-1)

六、标题:奇怪的分式

  • 枚举
  • 一开始由于double精度问题被坑了
package _2014JavaB组_48_100;
//double精度问题导致被坑
public class P6 {
	public static void main(String[] args) {
		int count = 0;
		for (int i = 11; i <= 99; i++) {//分母
			for (int j = 11; j <= 99; j++) {//分子
				if(i!=j) {
					double num1 = (double)(i/10)*(double)(i%10);
					double num2 = (double)(j/10)*(double)(j%10);
					if((num1/num2)==((double)i/j)) {
						System.out.println((i/10)+"/"+(j/10)+"*"+(i%10)+"/"+(j%10)+"="+i+"/"+j);
						count++;
					}
				}
			}
		}
		System.out.println(count);
	}
}

answer:14

七、标题:扑克序列

  • 全排列
package _2014JavaB组_48_100;

import java.util.HashMap;

//import java.util.Arrays;

public class P7 {
	public static String minStr = "";
	public static void qpl(char[] arr,int begin,int end) {
		if(begin==end) {
			//System.out.println(Arrays.toString(arr));
			HashMap<Character, Integer> map = new HashMap<Character, Integer>();
			for (int i = 0; i < arr.length; i++) {
				if(map.get(arr[i])!=null) {
					continue;
				}
				char temp = arr[i];
				
				switch (temp) {
				case 'A':
					if(i+2<arr.length && arr[i+2]==arr[i]) {
						map.put(arr[i], 1);
					}else {
						return;
					}
					break;
				case '2':
					if(i+3<arr.length && arr[i+3]==arr[i]) {
						map.put(arr[i], 1);
					}else {
						return;
					}
					break;
				case '3':
					if(i+4<arr.length && arr[i+4]==arr[i]) {
						map.put(arr[i], 1);
					}else {
						return;
					}
					break;
				case '4':
					if(i+5<arr.length && arr[i+5]==arr[i]) {
						map.put(arr[i], 1);
					}else {
						return;
					}
					break;
				}
			}
			if(String.valueOf(arr).compareTo(minStr)<0) {
				minStr = String.valueOf(arr);
			}
			return;
		}
		for (int j = begin; j <= end; j++) {
			swap(arr, begin, j);
			qpl(arr, begin+1, end);
			swap(arr, begin, j);
		}
	}
	
	public static void swap(char[] arr,int i,int j) {
		char temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	public static void main(String[] args) {
		//System.out.println("22AA3344".compareTo("A2A23344"));
		char[] arr = new char[] {'A','A','2','2','3','3','4','4'};
		minStr = String.valueOf(arr);
		qpl(arr, 0, arr.length-1);
		System.out.println(minStr);
	}
}

answer: 2342A3A4

八、标题:分糖果

  • 模拟

AcCode:

import java.util.Arrays;
import java.util.Scanner;

public class Main{
	public static boolean check(int[] nums) {
		for (int i = 1; i < nums.length; i++) {
			if(nums[i]!=nums[i-1]) {
				return false;
			}
		}
		return true;
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int[] nums = new int[N];
		for (int i = 0; i < nums.length; i++) {
			nums[i] = in.nextInt();
		}
		//System.out.println(Arrays.toString(nums));
		int count = 0;
		while(true) {
			int[] temp = new int[nums.length];
			//给左边的小朋友
			for (int i = 0; i < temp.length; i++) {
				nums[i] = nums[i]/2;
				temp[i] = nums[i];
			}
			for (int i = 1; i < temp.length; i++) {
				nums[i-1] = nums[i-1]+temp[i];
			}
			nums[nums.length-1] = nums[nums.length-1] + temp[0];
			//check
			if(check(nums)) {
				break;
			}
			//给糖果
			for (int i = 0; i < nums.length; i++) {
				if(nums[i]%2!=0) {
					nums[i]++;
					count++;
				}
			}
		}
		System.out.println(count);
	}
}

九、 标题:地宫取宝

  • dfs+记忆化搜索

AcCode:

import java.util.Scanner;

public class Main {
	public static int k;
	
	//public static long count = 0;
	
	public static long[][][][] cache = new long[51][51][14][13];
	static {
		for (int i = 0; i < 51; i++) {
			for (int j = 0; j < 51; j++) {
				for (int j2 = 0; j2 < 14; j2++) {
					for (int k = 0; k < 13; k++) {
						cache[i][j][j2][k] = -1;
					}
				}
			}
		}
	}
	
	public static long dfs(int[][] nums,int i,int j,int max,int nzNum) {
		if(i>=nums.length || j>=nums[0].length || nzNum>k) return 0;
		if(cache[i][j][max+1][nzNum]!=-1)return cache[i][j][max+1][nzNum];//记忆化搜索
		
		int thisNum = nums[i][j];
		long res = 0;
		if(i==nums.length-1 && j==nums[0].length-1) {
			if(nzNum==k) {
				res++;
			}else if(nzNum==k-1 && thisNum>max) {
				res++;
			}
			return res;
		}
		
		if(max<thisNum) {//拿宝藏
			//向右走
			res+=dfs(nums, i, j+1, thisNum, nzNum+1);
			//向下走
			res+=dfs(nums, i+1, j, thisNum, nzNum+1);
		}
		//不拿宝藏
		res+=dfs(nums, i, j+1, max, nzNum);//向右走
		res+=dfs(nums, i+1, j, max, nzNum);//向下走
		
		//将数存起来
		cache[i][j][max+1][nzNum] = res%1000000007;
		

		return cache[i][j][max+1][nzNum];
	}
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		k = in.nextInt();
		int[][] nums = new int[n][m];
		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < nums[i].length; j++) {
				nums[i][j] = in.nextInt();
			}
		}
		
		
		
		System.out.println(dfs(nums, 0, 0, -1, 0));
		
		
	}
}

十、 标题:矩阵翻硬币(难题)

  • 通过观察你会发现如果你要对于坐标为(x,y)上的硬币进行翻转的次数,其实是其x行的真因子个数乘以y列的真因子个数
  • 要使硬币翻面,其翻转次数一定是一个奇数
  • 那么x和y的真因子个数都应该是奇数
  • 那么什么数的真因子个数会是一个奇数呢?这个数一定是一个平方数
  • 那么问题就变成了1~x和1~y之间有多少个平方数的问题?
  • 1~n之间的平方数的个数应该是\sqrt{n} 个(向下取整)
  • 那么问题又变成了如何求大数的\sqrt{n} 问题,如果解决了这个问题答案就是\sqrt{x}*\sqrt{y}
  • 那么该如何求大数的\sqrt{n}呢?假设一个数的长度为len,那么开根号后数的长度有两种情况
  • 如果该数的长度为偶数,开根号后数的长度为len/2
  • 如果该数的长度为奇数,开根号后数的长度为len/2+1
  • 知道了开根号数的长度我们就可以对每个位上的数进行枚举

AcCode:

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	//大数开方,向下取整
	public static BigInteger sqrt(String str) {
		BigInteger target = new BigInteger(str);
		int len = str.length();
		if(len%2==0) {
			len/=2;
		}else {
			len = len/2+1;
		}
		char[] cArr = new char[len];
		Arrays.fill(cArr, '0');
		for (int pos = 0; pos < cArr.length; pos++) {
			for (char i = '0'; i <='9'; i++) {
				cArr[pos] = i;
				BigInteger temp = new BigInteger(String.valueOf(cArr));
				if(temp.pow(2).compareTo(target)>0) {
					cArr[pos] = (char)(i-1);
					break;
				}
			}
		}
		return new BigInteger(String.valueOf(cArr));
	}
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String n = in.next();
		String m = in.next();
		//System.out.println(sqrt(n));
		System.out.println(sqrt(n).multiply(sqrt(m)));
	}
}

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值