Directorio de artículos
Tema 1
Tema Descripción
coincidencia de edad
Esta pregunta es una pregunta para completar los espacios en blanco. Después de calcular el resultado, use la declaración de salida en el código para generar el resultado completo.
Xiao Ming fue al cine con su primo y alguien les preguntó su edad. Xiao Ming dijo: Este año es nuestro año de suerte. Los cuatro dígitos de mi año de nacimiento suman exactamente mi edad. También lo es el del primo. Se sabe que este año es 2014 y la edad mencionada por Xiao Ming se refiere a un año.
Infiere y completa el año de nacimiento de Xiao Ming.
Restricciones operativas
- Tiempo máximo de ejecución: 1s
- Memoria máxima en ejecución: 128M
responder
public class Main {
public static void main(String[] args) {
for (int i = 2014; i > 1950; i--) {
if ((2014 - i) == (i % 10 + (i / 10) % 10 + (i / 100) % 10 + (i / 1000) % 10))
System.out.println(i);
}
}
}
Nota: determine el intervalo (1950, 2014), el resultado es 2006, 1988, es mi primo, entonces nació en 2006
Respuesta: Yo: 1988 Él: 2006
tema dos
Tema Descripción
triangulo de naipes
Esta pregunta es una pregunta para completar los espacios en blanco. Después de calcular el resultado, use la declaración de salida en el código para generar el resultado completo.
A, 2, 3, 4, 5, 6, 7, 8, 9, un total de 9 cartas están dispuestas en un triángulo regular (A se cuenta como 1). Se requiere que la suma de cada lado sea igual. La siguiente figura es un arreglo.
Puede haber muchos arreglos de este tipo.
Si considerando la rotación y la imagen especular (simetría), el mismo es el mismo, ¿cuántos arreglos diferentes hay?
Calcule y envíe este número.
Restricciones operativas
- Tiempo máximo de ejecución: 1s
- Memoria máxima en ejecución: 256M
responder
public class Main {
static int ans = 0;
static int[] A = new int[9];// 用来存数据
static int[] B = new int[9];// 用来表示该数组的位置是否有被遍历过
public static void main(String[] args) {
dfs(0);
// 因为旋转和镜像代表的是同一种,但是它们各重复三次,即重复六次,所以最后要除以六
System.out.println(ans / 6);
}
public static void dfs(int num) {
if (num == 9 && ((A[0] + A[1] + A[2] + A[3]) == (A[3] + A[4] + A[5] + A[6]))
&& ((A[3] + A[4] + A[5] + A[6]) == (A[6] + A[7] + A[8] + A[0]))) {
ans++;
return;
}
for (int i = 0; i < 9; i++) {
if (B[i] == 0) {
A[num] = i + 1;// 对数组进行赋值
B[i] = 1;// 表示该位置已经赋值
dfs(num + 1);
B[i] = 0;// 回溯
}
}
}
}
Nota: la búsqueda de dfs, la disposición completa y la comprensión de los tres elementos son los más críticos
- Ajustes de parámetros de entrada
- configuración de exportación para dfs
- Si se requiere retroceder
Respuesta: 144
tema tres
Tema Descripción
juego de pelota
Hay n bolas en la caja. A y B se turnan para sacar bolas de la caja. Cada uno puede ver cuántas bolas ha cogido el otro y cuántas quedan en la caja. Todos son inteligentes y no se equivocan. juicios
Estamos de acuerdo:
El número de bolas que cada persona saca de la caja debe ser: 1, 3, 7 u 8. ¡No puedes abstenerte cuando te toca tomar la pelota! A toma la pelota primero y luego toma la pelota alternativamente hasta que termina. El lado obligado a recibir la última bola es el perdedor (lado perdedor)
Por favor programe para determinar si A puede ganar para un número inicial dado de bolas sin que ninguna de las partes se equivoque.
ingrese la descripción
El primero es un número entero n (n<100), lo que significa que hay n números enteros a continuación.
Entonces hay n enteros, cada uno en una línea (entero < 10^4), que representan el número inicial de bolas.
descripción de salida
Luego, el programa genera n líneas, lo que indica si A gana o pierde (0 para perder, 1 para ganar).
muestra de entrada
4 1 2 10 18
Salida de muestra
0 1 1 0
Restricciones operativas
- Tiempo máximo de ejecución: 1s
- Memoria máxima en ejecución: 256M
responder
(solución violenta)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//类似于爬楼梯的递归模式
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<Integer> l = new ArrayList<>();
for (int i = 0; i < n; i++) {
l.add(scanner.nextInt());
}
for (int j = 0; j < n; j++) {
if (A(l.get(j))) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}
public static boolean A(int m) {
if (m >= 1) {
switch (m) {
case 1:
return false;// 当你要去拿球时,并且最后只剩下1个球时,输
case 3:
return false;// 当你要去拿球时,并且最后只剩下3个球时,输
case 7:
return false;// 输
case 8:
return true;// 赢
default:
return (!A(m - 1) || !A(m - 3) || !A(m - 7) || !A(m - 8));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
}
}
return false;
}
}
(dp resolver)
import java.util.Scanner;
//dp解法
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
boolean[] A = new boolean[10009];// 因为n<10^4
A[0] = true;
for (int i = 1; i < 10009; i++) {
A[i] = (!(A[i - 1]) || (i >= 3 && !A[i - 3]) || (i >= 7 && !A[i - 7]) || (i >= 8 && !A[i - 8]));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
}
// 为了方便输出
int[] B = new int[n + 1];
for (int i = 1; i <= n; i++) {
int j = scanner.nextInt();
if (!A[j]) {
B[i] = 0;
} else {
B[i] = 1;
}
}
for (int k = 1; k <= n; k++) {
System.out.println(B[k]);
}
}
}
Solución violenta: código redundante, alta tasa de repetición, engorroso y engorroso
solución dp: solo hay dos resultados, él gana o yo gano, la relación entre el bien y el mal, use "||" para elegir cuatro métodos, lo que significa que mientras haya un método para ganar, ganaré en el final, y el método es el valor óptimo.
por ejemplo: 4 bolas
1, 1, 1, 1 (perdí)
3, 1 (gané)
Recorrer los resultados de los cálculos y acumularlos