2020第十一届蓝桥杯JavaB组省赛总结

大题的类名没写Main,再见了。

如果需要大题的代码可以说一声,有人需要我就写一下,被这个类名搞到心态崩了。

2020/10/26 更: 广东省JavaB组省一,感觉好水。

试题 A: 门牌制作

思路 :624

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
  
public class Main {
    static int N = 100000 * 4 + 5;
    static int M = 1000 + 5;
    static int mod = 1000000009;
    static Scanner cin = new Scanner(System.in);
     
    static int ans = 0;
    
    public static void main(String[] args) {
    	
    	for(int i = 1; i <= 2020; i++) {
    		check(i);
    	}
    	
		System.out.println(ans);
	}

	private static void check(int i) {
		while(i > 0) {
			if(i % 10 == 2) ++ans;
			i /= 10;
		}
	}
}



试题 B: 寻找 2020

思路: 16520

代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
  
public class Main {
    static int N = 100000 * 4 + 5;
    static int M = 1000 + 5;
    static int mod = 1000000009;
    static Scanner cin = new Scanner(System.in);
     
    static int ans = 0, n, m;
    static char c[][] = new char[M][M];
    
    public static void main(String[] args) {
    	while(cin.hasNext()) {
    		String s = cin.next();
    		m = s.length();
    		c[n++] = s.toCharArray();
    	}
    	for(int i = 0; i < n; i++)
    		for(int j = 0; j < m; j++)
    			if(c[i][j] == '2')
    				check(i, j);
    	
	}

	private static void check(int i, int j) {
		if(i + 3 < n)
			if(c[i+1][j] == '0' && c[i+2][j] == '2' && c[i+3][j] == '0')
				++ans;
		if(j + 3 < m)
			if(c[i][j+1] == '0' && c[i][j+2] == '2' && c[i][j+3] == '0')
				++ans;
		if(i + 3 < n && j + 3 < n)
			if(c[i+1][j+1] == '0' && c[i+2][j+2] == '2' && c[i+3][j+3] == '0')
				++ans;
	}
}

试题 C: 蛇形填数

思路: 761

代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
  
public class Main {
    static int N = 100000 * 4 + 5;
    static int M = 1000 + 5;
    static int mod = 1000000009;
    static Scanner cin = new Scanner(System.in);
     
    static int ans = 0, n, m;
    static int c[][] = new int[M][M];
    
    public static void main(String[] args) {
    	check(1, 1, 1, 1);
    	System.out.println(c[20][20]);
	}

	private static void check(int i, int j, int w, int f) {
		c[i][j] = w;
		if(i > 50 || j > 50) return;
		if(i == j && i == 1) check(i, j+1, w+1, -f);
		else if(f == -1) {
			if(j == 1) check(i+1, j, w+1, -f);
			else check(i+1, j-1, w+1, f);
		}
		else if(f == 1) {
			if(i == 1) check(i, j+1, w+1, -f);
			else check(i-1, j+1, w+1, f);
		}
		
	}
}

试题 D: 七段码

思路: 80

  1. 按边建图dfs保证联通,二进制枚举判重。

详细说一下吧,因为题目是给出由七个线段组成的灯管,他所要求出的是连在一起的线段的组合方式,那么我们可以考虑把给每个线段编号,赋予数字意义方便连边建成图,建成图后dfs就可以保证当前的递归状态所递归的灯管都是相连的,然后递归肯定会有很多重复的情况,那么不难想到用七位的二进制数来表示递归的状态,这样就可以保证每一个方案只会被计算一次。

代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
  
public class Main {
    static int N = 100000 * 4 + 5;
    static int M = 1000 + 5;
    static int mod = 1000000009;
    static Scanner cin = new Scanner(System.in);
     
    static int ans = 0, n, m;
    static ArrayList<Integer> g[] = new ArrayList[N]; //建图 第i个数组的元素都跟i相连
    static boolean vis[] = new boolean[N]; //判断当前这条线段是否被递归过
    static boolean dp[] = new boolean[N]; //二进制判重
    static int a[] = new int[1<<8];
    
    public static void main(String[] args) {
    	for(int i = 1; i <= 7; i++)
    		g[i] = new ArrayList<Integer>();
    		//这里就是赋予数字意义 重新连边
    	add(1, 2); add(1, 6); add(2, 7); add(2, 3); add(3, 4); 
    	add(4, 5); add(5, 6); add(5, 7); add(6, 7); add(3, 7);
    	for(int i = 1; i <= 7; i++) {
    		vis[i] = true; //这里枚举是保证至少有一条灯管是亮着的
    		dfs(i , 1);
    		vis[i] = false;
    	}
    	System.out.println(ans);
	}

	private static void dfs(int u, int k) {
		a[k] = u;  //递归的第k条线段是数字编号为u的线段
		check(k); //对每个状态都判重
		//这里从1枚举到k就是枚举当前联通块相连的边
		for(int i = 1; i <= k; i++) {
			for(int v: g[a[i]]) { 
				if(vis[v]) continue;
				vis[v] = true;
				dfs(v, k + 1);
				vis[v] = false;
			}
		}
	}

	private static void check(int k) {
		int res = 0;
		for(int i = 1; i <= k; i++) //因为每个线段的数字不同 代表的二进制数字也就不同
			res += (1<<a[i]);
		if(dp[res]) return;
		dp[res]  = true;
		ans++;
	}

	private static void add(int i, int j) {
		g[i].add(j); g[j].add(i);
	}

	

	
}

试题 E: 排序

思路: jonmlkihgfedcba

  1. 其实就是逆序数,算一下就可以,但是考试的时候脑子抽了一直dfs。

代码:

试题 F: 成绩分析

思路:

  1. 注意一下平均分的四舍五入就可以了。

代码:

试题 G: 单词分析

思路:

  1. 用个HashMap<Character,Integer>计数即可。

代码:

试题 H: 数字三角形

思路:

  1. d p [ i ] [ j ] + = m a x ( d p [ i − 1 ] [ j − 1 ] , d p [ i − 1 ] [ j ] ) dp[i][j]+=max(dp[i-1][j-1],dp[i-1][j]) dp[i][j]+=max(dp[i1][j1],dp[i1][j])
  2. n为奇数时答案为 d p [ n ] [ ( n + 1 ) / 2 ] dp[n][(n+1)/2] dp[n][(n+1)/2],偶数则是 m a x ( d p [ n ] [ n / 2 ] , d p [ n ] [ n / 2 + 1 ] ) max(dp[n][n/2],dp[n][n/2+1]) max(dp[n][n/2],dp[n][n/2+1])

试题 I: 子串分值和

思路:

  1. 开26个数组保存每个字母出现的下标
  2. 然后根据每个字母出现的下标差来计算当前字母对所有区间的答案贡献
  3. O ( 26 n ) 枚 举 即 可 O(26n)枚举即可 O(26n)

试题 J: 装饰珠

思路: 不会

  • 20
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值