蓝桥杯31天冲刺之二十七 [java]

放假出去玩了,少做几个。。

板块一:之前做过的历届真题的复习

分考场(17年国赛——3月25日)

https://www.lanqiao.cn/problems/109/learning/

四平方和(16年省赛——3月11日)

https://www.lanqiao.cn/problems/122/learning/

这个直接暴力解了

package daily;

import java.util.Scanner;

/**
 * http://lx.lanqiao.cn/problem.page?gpid=T2766
 * 
 * @author Jia
 *
 */
public class day3_11_3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();

		for (int i = 0; i <= Math.sqrt(n); i++) {
			for (int j = i; j <= Math.sqrt(n - i * i); j++) {
				for (int k = j; k <= Math.sqrt(n - i * i - j * j); k++) {
					if (Math.sqrt(n - i * i - j * j - k * k) == (int) Math.sqrt(n - i * i - j * j - k * k)) {
						System.out.println(i + " " + j + " " + k + " " + (int) Math.sqrt(n - i * i - j * j - k * k));
						return;
					}
				}
			}
		}
	}
}

最少砝码(21年省赛——3月8日)

https://www.lanqiao.cn/problems/1461/learning/

这个还是那个公式,记着是两边都能放,忘了的回去翻翻

package daily;

import java.util.Scanner;

public class day3_8_2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		int range = 1; // 量程
		int res = 1; // 砝码数
		while (range < n) {
			range += (range + range + 1);
			res++;
		}
		System.out.println(res);
	}
}

k倍区间(17年省赛——3月16日)

https://www.lanqiao.cn/problems/97/learning/

板块二:今日练习

七段码(20年省赛)

https://www.lanqiao.cn/problems/595/learning/

呃,这个题看题以为挺简单的,然后向直接动手找来着,后来放弃了hhhh

然后后面的想法是把所有边的连接关系记录下来,然后列出所有可能的选择,再去判断这种选择能不能成立

列出全部的选择的话就是回溯法的子集树了,然后由于每次的大小不一样,所以需要多次dfs找子集树,在达到需要的大小后再去判断是否满足条件(其实也可以一次bfs,在每次进入时候都去判断一下,但是我感觉不太好像,还是直接套模板的写法比较好)

然后对每个边进行如下标号,建立一个矩阵存储边的连接关系,对于给出的一个子集判断是否满足条件时需要看这几个边有几个连接点,比如对于0,1,2,3有3个连接点,自己多列几个例子就会发现,对于n个边来说会至少有n-1个连接点,因此如何判断子集是否满足条件的关系就出来了(这里有一种例外,比如0,1,6,5就有4连接点,不过为所谓),除此之外还要确定每一个边与其他边至少有一个连接,在代码中我用的是set去判断的

image-20220329220810884

答案:80

package year2020A;

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

/**
 * http://oj.ecustacm.cn/problem.php?id=1511
 * 
 * @author Jia
 *
 */
public class exercise4 {
	static int[][] link = { { 0, 1, 0, 0, 0, 1, 0 }, { 1, 0, 1, 0, 0, 0, 1 }, { 0, 1, 0, 1, 0, 0, 1 },
			{ 0, 0, 1, 0, 1, 0, 0 }, { 0, 0, 0, 1, 0, 1, 1 }, { 1, 0, 0, 0, 1, 0, 1 }, { 0, 1, 1, 0, 1, 1, 0 }, };
	static int ans = 0;
	static int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
	static ArrayList<Integer> nums = new ArrayList<>();// 记录组合

	public static void main(String[] args) {
		for (int size = 1; size <= 7; size++) {
			dfs(size, 0);
		}
		System.out.println(ans);
	}

	/**
	 * 回溯法
	 * 
	 * @param size
	 * @param index
	 */
	private static void dfs(int size, int index) {
		if (nums.size() == size) {
			check();
		} else {
			for (int i = index; i < link.length; i++) {
				nums.add(i);
				dfs(size, i + 1);
				nums.remove(nums.size() - 1);
			}
		}
	}

	/**
	 * 判断这种选择是否满足条件
	 */
	private static void check() {
		int num = nums.size();
		Set<Integer> set = new HashSet<>();// 使用hashset是为了确保所有的边都和其他有相连
		for (int i = 0; i < nums.size() - 1; i++) {
			for (int j = i + 1; j < nums.size(); j++) {
				if (link[nums.get(i)][nums.get(j)] == 1) {
					num--;
					set.add(i);
					set.add(j);
				}
			}
		}
		// 节点剩余连接数小于1并且所有的边都相连着
		if (num <= 1 && (set.size() == nums.size() || nums.size() == 1)) {
			ans++;
		}
	}

}

区间移位(17年国赛)

https://www.lanqiao.cn/problems/111/learning/

数正方形(19年国赛)

https://www.lanqiao.cn/problems/245/learning/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值