题目链接: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);
}
}
题目链接: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;
}
}
题目链接: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);
}
}
题目链接:https://www.lanqiao.cn/problems/168/learning/
这题第五天出了一次不会,现在还是不会,麻了,本来想当成背包做的,但是还要要求三个的余数相同,找不出转移方程,哎,不管了,摆烂了