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

距离和

image-20220324122907569

题目链接:https://www.lanqiao.cn/problems/585/learning/

这个题直接两次循环计算就行了,唯一注意的就是算的时候记得加绝对值

package daily;

/**
 * https://www.lanqiao.cn/problems/585/learning/
 * 
 * @author Jia
 *
 */
public class day3_24_1 {
	public static void main(String[] args) {
		String str = "LANQIAO";
		int ans = 0;
		for (int i = 0; i < str.length(); i++) {
			char ch = str.charAt(i);
			for (int j = i + 1; j < str.length(); j++) {
				ans += Math.abs(ch - str.charAt(j));
			}
		}
		System.out.println(ans);
	}
}

扩散

image-20220324123207420

题目链接:https://www.lanqiao.cn/problems/1019/learning/

类似于曾经的一个题目:灌溉,基本就是一模一样的,直接bfs遍历就行了,然后再定义一个数组去看这个格子是不是被染过色了,染过色就不加队列了,如果没染过就加队列继续判断其周围的元素

唯一要注意的就是初始的几个节点已经是黑色了,所以ans需要设置为4,然后是这里的画布是无穷大的,所以(0,0)其实并不是矩阵的左上角,我们应该给他加一个2020才可以确保他不会出界,但是我懒得算是+2020还是+2021就直接给加了3000,大了总比小了好,反正填空也不怕超时和超过内存限制

然后在代码中的bound其实没有必要加上,因为人为控制使得它肯定不会越界,但是还是写上吧,看起来合理一点,就当是默写模板了

package daily;

import java.util.Deque;
import java.util.LinkedList;

/**
 * https://www.lanqiao.cn/problems/1019/learning/
 * 
 * @author Jia
 *
 */
public class day3_24_2 {
	public static void main(String[] args) {
		int K = 2020;
		Deque<DrawNode> queue = new LinkedList<>();
		boolean[][] draw = new boolean[8000][8000];// 画布是否被染黑
		int[][] list = { { 0, 0 }, { 2020, 11 }, { 11, 14 }, { 2000, 2000 } };// 初始的四个节点

		for (int i = 0; i < list.length; i++) {
			int row = list[i][0] + 3000;
			int col = list[i][1] + 3000;
			queue.addLast(new DrawNode(row, col, 0));
			draw[row][col] = true;
		}
		long ans = 4;

		int[] nextRow = { 0, -1, 0, 1 };
		int[] nextCol = { 1, 0, -1, 0 };
		while (!queue.isEmpty()) {
			DrawNode node = queue.removeFirst();
			if (node.time == K) {
				// 第2020分钟染色的,不用考虑它染到其他节点了
				continue;
			}

			// 遍历接下来的四个方向,看看是否可以加入队列中
			for (int i = 0; i < nextCol.length; i++) {
				int newRow = node.row + nextRow[i];
				int newCol = node.col + nextCol[i];

				if (bound(draw, newRow, newCol) && draw[newRow][newCol] == false) {
					ans++;
					draw[newRow][newCol] = true;
					queue.addLast(new DrawNode(newRow, newCol, node.time + 1));
				}
			}
		}
		System.out.println(ans);
	}

	/**
	 * 判断是否到了边界外,这个题其实可以不用判断是否会越界,因为人为的设置使得它不可能越界
	 * 
	 * @param draw
	 * @param newRow
	 * @param newCol
	 * @return
	 */
	private static boolean bound(boolean[][] draw, int newRow, int newCol) {
		return newRow >= 0 && newRow < draw.length && newCol >= 0 && newCol < draw[0].length;
	}
}

class DrawNode {
	int row;// 行
	int col;// 列
	int time;// 时间

	public DrawNode(int row, int col, int time) {
		super();
		this.row = row;
		this.col = col;
		this.time = time;
	}
}

错误票据

image-20220324130903600

题目链接:https://www.lanqiao.cn/problems/205/learning/

这个题实际就是给一个连续的数列,找到缺失值与重复值

我用了一点数学的方法,如果不这样的话可能需要在数据读完之后再进行一遍遍历才能找到

由于输入的数字之间是连续的,也就是说公差为1,那么可以根据最大值与最小值算出他们实际的和(题目说了最大最小值是准确的),然后在读数据的时候计算读入数据的和,这两个的差值就是重复值与缺失值之间的差值,这个如果想不来的话可以自己动手算一下题目上的例子,还是比较好理解的

package daily;

import java.io.IOException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * https://www.lanqiao.cn/problems/205/learning/
 * 
 * @author Jia
 *
 */
public class day3_24_3 {
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		int N = Integer.parseInt(sc.nextLine());
		int minVal = Integer.MAX_VALUE;// 输入数据中的最小值
		int maxVal = Integer.MIN_VALUE;// 输入数据中的最大值
		int repeatVal = 0;// 重复值
		long sum = 0;// 输入值的总和
		Set<Integer> set = new HashSet<>();

		for (int i = 0; i < N; i++) {
			String str = sc.nextLine();
			String[] strs = str.split(" ");
			for (int j = 0; j < strs.length; j++) {
				int val = Integer.parseInt(strs[j]);
				minVal = Math.min(val, minVal);
				maxVal = Math.max(val, maxVal);
				sum += val;
				if (set.contains(val)) {
					repeatVal = val;
				}
				set.add(val);
			}
		}
		sc.close();

		long actualSum = (minVal + maxVal) * (maxVal - minVal + 1) / 2;// 根据最小值和最大值计算出来的实际和
		int sub = (int) (actualSum - sum);// 实际值与计算值的差值
		int missVal = repeatVal + sub;// 计算缺少的值
		System.out.println(missVal + " " + repeatVal);
	}
}

倍数问题

image-20220324133336484

题目链接:https://www.lanqiao.cn/problems/168/learning/

这题第五天出了一次不会,现在还是不会,麻了,本来想当成背包做的,但是还要要求三个的余数相同,找不出转移方程,哎,不管了,摆烂了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hydrion-Qlz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值