真题下载地址
需要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之间的平方数的个数应该是 个(向下取整)
- 那么问题又变成了如何求大数的 问题,如果解决了这个问题答案就是
- 那么该如何求大数的呢?假设一个数的长度为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))); } }