Blue Bridge Cup sprint veinticuatro de 31 días [java]

correr entrenamiento

imagen-20220331125400129

Enlace del tema: https://www.lanqiao.cn/problems/597/learning/

Esta pregunta puede atravesar todas las fechas. Resulta que siempre he usado la clase Calendar. Encontré la LocalDateclase una vez y me pareció muy útil. Sin embargo, hay muchas funciones cuyos valores de retorno no conocen el tipo. , por lo que solo puedo mirar el código fuente. Encuéntralo o mira el manual de la 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);
	}
}

línea recta

imagen-20220331131235153

Enlace del tema: https://www.lanqiao.cn/problems/1449/learning/

Esta pregunta es realmente insensible. El método que usé cuando lo hice por primera vez fue y = kx + by=kx+by=k x+b , y luego la fórmula directa calculakkk , me olvidé de la precisión del doble, cometí un error y luego consideré la ecuación de la línea recta comoA x + B y + C = 0 Ax+By+C=0una x+por _+C=0 se puede hacer, pero es solo contraABC ABCHubo un problema cuando A B C pasó la puntuación, y finalmente se corrigió.

La idea es relativamente simple, es decir, encontrar una línea recta para dos puntos cualesquiera y luego desduplicar la línea para obtener el resultado final. La dificultad es cómo desduplicar. Si calcula directamente la pendiente, fallará. debido a problemas de precisión. También hay una idea. Es almacenar el numerador y el denominador de la pendiente y la compensación, y dividirlos hasta el más simple. Esta es una forma de pensar. Naturalmente, no habrá problemas de precisión.

hashCodeDado que Set en Java debe reescribirse y dos métodos si desea utilizar una clase personalizada, es equalsdemasiado lento para escribirlo usted mismo. Eclipse tiene teclas de método abreviado que se pueden construir directamente. En la interfaz de escritura de código, haga clic con el botón derecho: > Fuente->Seleccione dos en el cuadro. Esto puede ahorrar mucho tiempo. En otras palabras, está toString, que puede ser muy conveniente para depurar el programa. De lo contrario, imprimirá un montón de direcciones.

imagen-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;
	}
}

decimales recurrentes

imagen-20220331141333816

Enlace del tema: https://www.lanqiao.cn/problems/1051/learning/

Uh, si hace esta pregunta usted mismo, se estima que será violenta, pero siento que puede haber la misma pregunta de precisión que la pregunta anterior, y luego busqué el método de conversión en Internet:

1. Convierte decimales periódicos puros en fracciones

Método: Reescriba el decimal periódico puro en una fracción, el numerador es un número compuesto de números en una sección periódica; los números en el denominador son todos 9, y el número de 9 es el mismo que el número de números en la sección periódica , y finalmente se puede reducir el número.

2. Convertir decimales de ciclo mixto a fracciones

Método: Reescribe el decimal periódico mixto como una fracción, y el numerador es la diferencia que se obtiene al restar el número compuesto por los números de la parte decimal en la sección periódica menos los números compuestos por la parte no circular en la parte decimal; el primeros dígitos del denominador son 9, y los últimos dígitos son El número de dígitos es 0, el número de 9 es el mismo que el de los dígitos de la sección de bucle, y el número de 0 es el mismo que el de los dígitos de la sección sección sin bucles.

solicitud:

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

0.123123…=123/999

0.12333…=(123-12)/900=111/900=37/300

Para unificar las características de las conclusiones anteriores es: si el número de dígitos en la sección del ciclo más el número de dígitos no reciclados es total, entonces el denominador es el número de dígitos 9+0, el número de 9 es igual a la número de dígitos en la sección del ciclo, y el número de 0 es igual al número de dígitos no reciclados. El número de dígitos, el numerador es igual a = el número que no se repite después del punto decimal más el número formado por la primera sección repetida, menos el número que no se repite después del punto decimal.

Aquí solo puede ver el ejemplo y la conclusión final, y luego traducirlo a código de la siguiente manera

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);
	}
}

Transposición de tarjetas

imagen-20220331143628286

Enlace del tema: https://www.lanqiao.cn/problems/125/learning/

Esta pregunta puede ser hecha directamente por bfs. Estaba atontado en clase por la mañana y no puedo escribir la mitad. Puedo terminarlo por la noche.

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;
	}

}

Supongo que te gusta

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