# 历届蓝桥杯省赛Java B组真题思路总结

18 篇文章 0 订阅

## 历届蓝桥杯Java B组思路总结

### 13年省赛

#### 振兴中华

public class Main {

public static void main(String[] args) {
int m = dfs(0, 0);
System.out.println(m);
}

// dfs
public static int dfs(int i, int j) {
if (i == 3 || j == 4) {
return 1;
}
return dfs(i + 1, j) + dfs(i, j + 1);
}
}


#### 黄金连分数

public class Main {
public static void main(String[] args) {
BigInteger a = BigInteger.ONE;
BigInteger b = BigInteger.ONE;
for (int i = 3; i < 500; i++) {
BigInteger t = b;
a = t;
}
BigDecimal div = new BigDecimal(a, 110).divide(new BigDecimal(b, 110), BigDecimal.ROUND_HALF_DOWN);
System.out.println(div.toPlainString().substring(0, 103));
}
}


#### 连号区间数

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = sc.nextInt();
}
sc.close();
int ans = 0;
for (int i = 0; i < arr.length; i++) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int j = i; j < arr.length; j++) {
max = Math.max(max, arr[j]);
min = Math.min(min, arr[j]);
if ((max - min + 1) == j - i + 1) {
ans++;
}
}
}
System.out.println(ans);
}
}


### 14年省赛

#### 猜字母

public class Main {

public static void main(String[] args) {
char[] arr = new char[2014];
int index = 0;
for (int i = 0; i < 106; i++) {
for (int j = 0; j < 19; j++) {
arr[index++] = (char) ('a' + j);
}
}
// System.out.println(Arrays.toString(arr));
int len = 2014;
while (len != 1) {
int mm = 0;
for (int i = 1; i < len; i += 2) {
arr[mm++] = arr[i];
}
len = mm;
}
System.out.println(arr[0]);
}
}


#### 奇怪的分式

//递归求解最大公约数
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}


#### 扑克排序

import java.util.HashSet;
import java.util.Set;

public class Main {

public static void main(String[] args) {
char[] a = { 'A', 'A', '2', '2', '3', '3', '4', '4' };
fun(a, 0);
for (String c : set) {
System.out.println(c);
}
}

// 去重
static Set<String> set = new HashSet<>();

// 递归框架求解全排列
public static void fun(char[] a, int k) {
// 判断
if (k == a.length) {
String s = new String(a);
if (check(s)) {
}
}
// 全排列
for (int i = k; i < a.length; i++) {
char t = a[k];
a[k] = a[i];
a[i] = t;

fun(a, k + 1);

// 回溯
t = a[k];
a[k] = a[i];
a[i] = t;
}
}

// 检查
public static boolean check(String s) {
if (s.lastIndexOf('A') - s.indexOf('A') == 2 && s.lastIndexOf('2') - s.indexOf('2') == 3
&& s.lastIndexOf('3') - s.indexOf('3') == 4 && s.lastIndexOf('4') - s.indexOf('4') == 5) {
return true;
} else {
return false;
}
}
}


#### 分糖果

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();// 输入几个孩子
// 用数组表示一个圈
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = input.nextInt();
}
int ans = 0;

while (true) {
int t = a[0];
for (int i = 0; i <= n - 2; i++) {
a[i] -= a[i] / 2;// 先减去一半 再加上下一项的一半
a[i] += a[i + 1] / 2;
if ((a[i] & 1) == 1) {
ans++;
a[i]++;
}
}
// 最后一项也要进行一样的操作
a[n - 1] -= a[n - 1] / 2;
a[n - 1] += t / 2;
if ((a[n - 1] & 1) == 1) {
ans++;
a[n - 1]++;
}

// 检验
if (check(a, n)) {
System.out.println(ans);
break;
}
}

}

// 检验
public static boolean check(int[] a, int n) {
int t = a[0];
for (int i = 1; i < n; i++) {
if (a[i] != t) {
return false;
}
}
return true;
}
}


emmmm。。。。。。

### 15年省赛

#### 立方变自身

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

public class Main {

public static void main(String[] args) {
int count = 0;
for (int i = 1; i < 99; i++) {
int m = i * i * i;
String s = String.valueOf(m);
int sum = 0;
for (int j = 0; j < s.length(); j++) {
int a = Integer.parseInt(String.valueOf(s.charAt(j)));
sum += a;
}
if (sum == i) {
count++;
}
}
System.out.println(count);
}
}


#### 九数组分数

//全排列的实现算法 递归+交换
package Test.Arithmetic;

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

public class Main {

public static void main(String[] args) {
perm(new int[] { 1, 2, 3, 4 }, 0, 3);
}

// 递归输出全排列
public static void perm(int[] array, int start, int end) {
if (start == end) {
System.out.println(Arrays.toString(array));
} else {
for (int i = start; i <= end; i++) {
swap(array, start, i);
perm(array, start + 1, end);
swap(array, start, i);
}
}
}

// 交换数字
public static void swap(int[] array, int i, int j) {
int t = array[i];
array[i] = array[j];
array[j] = t;
}
}


#### 加法变乘法

public class Main {

public static void main(String[] args) {
for (int i = 1; i <= 46; i++) {
for (int j = i + 2; j <= 48; j++) {
if (i * (i + 1) - (i + i + 1) + j * (j + 1) - (j + j + 1) == 2015 - 1225) {
System.out.println(i + " " + j);
}
}
}
}
}


#### 饮料换购

public class Main {

public static void main(String[] args) {
int ans = 0;
int n=100;
while(n >= 3) {
n -= 2;
ans += 3;
}
ans += n;
System.out.println(ans);
}
}


dp，矩阵，，，太难了。。。。

。。。。。

### 16年省赛

#### 生日蜡烛

public class Main {
public static void main(String[] args) {
for (int i = 1; i < 100; i++) {
int t = i * (i - 1) / 2;
if ((236 - t) % i == 0) {
System.out.println((236 - t) / i);
}
}
}
}//总感觉是似曾相识啊！！！


#### 压缩变换

hash查找+标注+区间树

ps：这一年的题居然考了三道全排列，但感觉16年的题目普遍偏难，当年要是我考的话可能连省三都没有。。。

### 17年省赛

#### 纸牌三角形

import static java.lang.Math.*;

/**
* 全排列模板
*/
public class Main {
static int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static int ans = 0;

public static void main(String[] args) {
fun(0);
System.out.println(ans / 6);
}

// 全排列函数
public static void fun(int k) {
// 先判断是否到达边界 check的逻辑可能不同，别的相同
if (k == a.length) {
int x1 = a[0] + a[1] + a[3] + a[5];
int x2 = a[0] + a[2] + a[4] + a[8];
int x3 = a[5] + a[6] + a[7] + a[8];
if (x1 == x2 && x2 == x3) {
ans++;
}
}

// 然后进行全排列
for (int i = k; i < a.length; i++) {
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
fun(k + 1);
// 回溯
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
}


170多行代码，，，过了

### 18年省赛

#### 螺旋折线

。。。。。剩下的部分日后有缘再续上吧~~明天加油！！！

• 0
点赞
• 9
收藏
觉得还不错? 一键收藏
• 0
评论
03-06
03-05 2万+
02-03 2757
08-17
12-22 1万+
03-16 2万+
08-26 8687
05-03 1万+
11-10 2万+
12-29 8581
02-19 1万+

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

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

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