Blue Bridge Cup 31 dias sprint vinte e quatro [java]

treino de corrida

imagem-20220331125400129

Link do tópico: https://www.lanqiao.cn/problems/597/learning/

Essa questão pode apenas percorrer todas as datas. Acontece que sempre usei a classe Calendar. Encontrei a LocalDateclasse uma vez e achei muito útil. Porém, existem muitas funções cujos valores de retorno não sabem o tipo , então só posso ver o código-fonte. Encontre-o ou consulte o manual da API

package daily;

import java.time.DayOfWeek;
import java.time.LocalDate;

/**
 * https://www.lanqiao.cn/problems/597/learning/
 * 
 * @author Jia
 *
 */
public class day3_31_1 {
    
    
	public static void main(String[] args) {
    
    
		LocalDate left = LocalDate.of(2000, 1, 1);
		LocalDate right = LocalDate.of(2020, 10, 1);
		int ans = 0;

		while (left.compareTo(right) <= 0) {
    
    
			DayOfWeek dayOfWeek = left.getDayOfWeek();// 星期几
			int dayOfMonth = left.getDayOfMonth();// 每月的日期
			if (dayOfWeek.getValue() == 1 || dayOfMonth == 1) {
    
    
				ans += 2;
			} else {
    
    
				ans += 1;
			}

			left = left.plusDays(1);// 下一天
		}
		System.out.println(ans);
	}
}

linha reta

imagem-20220331131235153

Link do tópico: https://www.lanqiao.cn/problems/1449/learning/

Esta questão é realmente insensível. O método que usei quando fiz isso pela primeira vez foi y = kx + by = kx + bS=k x+b , e então a fórmula direta calculakkk , esqueci a precisão de double, cometi um erro e depois considerei a equação da linha reta comoA x + B y + C = 0 Ax+By+C=0A x+Por _+C=0 pode ser feito, mas é apenas contraABC ABCHouve um problema quando A B C passou na pontuação e, finalmente, foi corrigido.

A ideia é relativamente simples, ou seja, encontrar uma linha reta para quaisquer dois pontos e, em seguida, desduplicar a linha para obter o resultado final. A dificuldade é como desduplicar. Se você calcular a inclinação diretamente, ela falhará devido a problemas de precisão. Há também uma idéia. É armazenar o numerador e denominador da inclinação e deslocamento, e dividi-los para o mais simples. Esta é uma maneira de pensar. Naturalmente, não haverá problemas de precisão.

hashCodeComo Set em java precisa ser reescrito e dois métodos se você quiser usar uma classe personalizada, é equalsmuito lento escrevê-lo sozinho. O Eclipse possui teclas de atalho que podem ser construídas diretamente. Na interface de escrita de código, clique com o botão direito do mouse - > Source->Selecione dois na caixa. Isso pode economizar muito tempo. Em outras palavras, existe o toString, que pode ser muito conveniente para depurar o programa. Caso contrário, ele imprimirá vários endereços.

imagem-20220331131235153

package daily;

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

/**
 * https://www.lanqiao.cn/problems/1449/learning/
 * 
 * @author Jia
 *
 */
public class day3_31_2 {
    
    
	public static void main(String[] args) {
    
    
		int xEnd = 20;
		int yEnd = 21;

		int[][] points = new int[xEnd * yEnd][2];
		int index = 0;
		// 构造点集
		for (int i = 0; i < xEnd; i++) {
    
    
			for (int j = 0; j < yEnd; j++) {
    
    
				points[index][0] = i;// x
				points[index][1] = j;// y
				index++;
			}
		}

		// 两点构造一条直线,得到该直线 Ax + By + C = 0 的表达式,在构造函数中会对 ABC 除以他们的最大公约数进行约分
		Set<Line1> lineSet = new HashSet<>();
		for (int i = 0; i < points.length; i++) {
    
    
			for (int j = i + 1; j < points.length; j++) {
    
    
				int a1 = points[i][0];
				int b1 = points[i][1];

				int a2 = points[j][0];
				int b2 = points[j][1];

				int A = a2 - a1;
				int B = b2 - b1;
				int C = a2 * b1 - a1 * b2;
				lineSet.add(new Line1(A, B, C));

			}
		}
		System.out.println(lineSet.size());
	}
}

class Line1 {
    
    
	int A;
	int B;
	int C;

	public int gcd(int a, int b) {
    
    
		// 当有一个数为0的时候,直接返回另一个数字
		if (a == 0 || b == 0) {
    
    
			return a == 0 ? b : a;
		}
		return a % b == 0 ? b : gcd(b, a % b);
	}

	public Line1(int a, int b, int c) {
    
    
		super();
		int gcd = 1;
		gcd = gcd(a, b);
		gcd = gcd(gcd, c);
		A = a / gcd;
		B = b / gcd;
		C = c / gcd;
	}

	@Override
	public int hashCode() {
    
    
		final int prime = 31;
		int result = 1;
		result = prime * result + A;
		result = prime * result + B;
		result = prime * result + C;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
    
    
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Line1 other = (Line1) obj;
		if (A != other.A)
			return false;
		if (B != other.B)
			return false;
		if (C != other.C)
			return false;
		return true;
	}
}

decimais recorrentes

imagem-20220331141333816

Link do tópico: https://www.lanqiao.cn/problems/1051/learning/

Uh, se você fizer essa pergunta sozinho, estima-se que será violento, mas sinto que pode haver a mesma pergunta de precisão que a perguntada acima, e então pesquisei o método de conversão na Internet:

1. Converta decimais recorrentes puros em frações

Método: Reescreva a dízima periódica pura em uma fração, o numerador é um número composto de números em uma seção recorrente; os números no denominador são todos 9 e o número de 9s é o mesmo que o número de números na seção recorrente , e finalmente o número pode ser reduzido.

2. Converta decimais de ciclo misto em frações

Método: Reescreva a dízima periódica mista como uma fração, e o numerador é a diferença obtida subtraindo-se o número composto pelos números da parte decimal na seção recorrente menos os números compostos pela parte não circular da parte decimal; o primeiros dígitos do denominador são 9, e os últimos dígitos são O número de dígitos é 0, o número de 9s é o mesmo que os dígitos da seção de loop, e o número de 0s é o mesmo que os dígitos do seção sem loop.

inscrição:

13,12323…=13+(123-1)/990=6496/495

0,123123…=123/999

0,12333…=(123-12)/900=111/900=37/300

Para unificar as características das conclusões acima é: se o número de dígitos na seção do ciclo mais o número de dígitos não reciclados é total, então o denominador é o número de dígitos 9+0, o número de 9 é igual ao número de dígitos na seção do ciclo, e o número de 0 é igual ao número de dígitos não reciclados. O número de dígitos; o numerador é igual a = o número que não se repete após o ponto decimal mais o número formado por a primeira seção de repetição, menos o número que não se repete após o ponto decimal.

Aqui você pode apenas ver o exemplo e a conclusão final e depois traduzi-lo em código da seguinte maneira

package daily;

import java.util.Scanner;

/**
 * https://www.lanqiao.cn/problems/1051/learning/
 * 
 * @author Jia
 *
 */
public class day3_31_3 {
    
    
	public static void main(String[] args) {
    
    
		Scanner sc = new Scanner(System.in);
		int p = sc.nextInt();
		int q = sc.nextInt();
		String num = sc.next();
		sc.close();

		int len_buxunhuan = p - 1;
		int len_xunhuan = q - p + 1;

		int buxunhuan = len_buxunhuan == 0 ? 0 : Integer.parseInt(num.substring(0, p - 1));
		int xunhuan = Integer.parseInt(num.substring(p - 1, q));

		int fenmu = 0;
		for (int i = 0; i < len_xunhuan; i++) {
    
    
			fenmu = fenmu * 10 + 9;
		}
		for (int i = 0; i < len_buxunhuan; i++) {
    
    
			fenmu = fenmu * 10;
		}

		int fenzi = (int) (buxunhuan * Math.pow(10, len_xunhuan) + xunhuan - buxunhuan);
		int gcd = gcd(fenzi, fenmu);
		System.out.println(fenzi / gcd + " " + fenmu / gcd);
	}

	/**
	 * 求最大公约数
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	private static int gcd(int a, int b) {
    
    
		return a % b == 0 ? b : gcd(b, a % b);
	}
}

Transposição do cartão

imagem-20220331143628286

Link do tópico: https://www.lanqiao.cn/problems/125/learning/

Esta pergunta pode ser feita diretamente por bfs. Eu estava entorpecido na aula de manhã, e não consigo escrever metade dela. Posso terminar à noite.

package daily;

import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Set;

/**
 * https://www.lanqiao.cn/problems/125/learning/
 * 
 * @author Jia
 *
 */
public class day3_31_4 {
    
    
	public static void main(String[] args) {
    
    
		Scanner sc = new Scanner(System.in);
		char[][] chs = new char[2][3];
		for (int i = 0; i < chs.length; i++) {
    
    
			String str = sc.nextLine();
			for (int j = 0; j < str.length(); j++) {
    
    
				chs[i][j] = str.charAt(j);
			}
		}
		sc.close();

		Deque<char[][]> queue = new LinkedList<>();
		Set<String> set = new HashSet<>();
		set.add(chs2Str(chs));
		queue.addFirst(chs);
		int[] nextRow = {
    
     0, 1, 0, -1 };
		int[] nextCol = {
    
     1, 0, -1, 0 };

		int ans = 0;

		while (!queue.isEmpty()) {
    
    
			int size = queue.size();
			ans++;
			while (size > 0) {
    
    
				char[][] chArr = queue.removeLast();
				for (int i = 0; i < nextRow.length; i++) {
    
    
					// todo
				}
			}

		}
	}

	/**
	 * 字符数组转化成字符串
	 * 
	 * @param chs
	 * @return
	 */
	private static String chs2Str(char[][] chs) {
    
    
		String str = "";
		for (int i = 0; i < chs.length; i++) {
    
    
			for (int j = 0; j < chs[0].length; j++) {
    
    
				str += chs[i][j];
			}
		}
		return str;
	}

}

Acho que você gosta

Origin blog.csdn.net/qq_46311811/article/details/123872190
Recomendado
Clasificación