放假出去玩了,少做几个。。
文章目录
板块一:之前做过的历届真题的复习
分考场(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去判断的
答案: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/