La conjetura de Callatz ha sido descrita en 1001. En este tema, la situación es un poco más complicada.
Cuando verificamos la conjetura de Karaz, para evitar cálculos repetidos, podemos registrar cada número encontrado en el proceso de recursión.
Por ejemplo , cuando verificamos n = 3, necesitamos calcular 3, 5, 8, 4, 2, 1, luego cuando verificamos n = 5, 8, 4, 2, podemos determinar directamente la conjetura de Karaz No es necesario repetir el cálculo, ya que estos 4 números ya se han encontrado al verificar 3. Llamamos a 5, 8, 4, 2 para que estén "cubiertos" por 3. Llamamos a cierto número n en una secuencia como "número clave", si n no puede ser cubierto por otros números en la secuencia.
Ahora, dada una serie de números para verificar, solo necesitamos verificar algunos de los números clave, y no tenemos que verificar los números restantes nuevamente. Su tarea es encontrar estas cifras clave y generarlas en orden de mayor a menor.
Formato de entrada:
Cada entrada de prueba contiene 1 caso de prueba, la primera línea da un número entero positivo K ( <), la segunda línea da K números enteros positivos diferentes n ( 1) para verificar , con espacios entre los números Por separado.
Formato de salida:
La salida de cada caso de prueba ocupa una línea, y los números clave se emiten en orden de mayor a menor. Los números están separados por un espacio, pero no hay espacio después del último número en una fila.
Entrada de muestra:
6
3 5 6 7 8 11
Salida de muestra:
7 6
1 #include <iostream>
2
3 #include <algoritmo>
4 #include <vector>
5 #include < string >
6
7
8
9 usando el espacio de nombres std;
10
11 bool is_contain_this_num (vector < int > nums, int a)
12 {
13 for ( int i = 0 ; i <nums.size (); ++ i)
14 {
15 if (a == nums [i])
16 {
17 regreso verdadera ;
18 }
19 }
20 devuelve falso ;
21 }
22
23
24 bool cmp ( int s1, int s2)
25 {
26 return s1> s2;
27 }
28
29 int main ()
30 {
31 int numcount;
32 cin >> numcount;
33 vectores < int > nums;
34 para ( inti = 0 ; i <numcount; ++ i)
35 {
36 int num;
37 cin >> num;
38 nums.push_back (num);
39 }
40
41 // 存放 经过 检验 的 数
42 vector < int > check_vec;
43 para ( int i = 0 ; i <nums.size (); ++ i)
44 {
45 int n = nums [i];
46 if (! Is_contain_this_num (check_vec, n))
47 {
48 while (n! = 1 ) {
49 if (n% 2 == 0 )
50 {
51 n / = 2 ;
52 } más
53 {
54 n = ( 3 * n + 1 ) / 2 ;
55 }
56 if (! Is_contain_this_num (check_vec, n))
57 {
58 check_vec.push_back (n);
59 }
60 }
61 }
62 }
63
64 vector < int > resultado;
65 para ( int i = 0 ; i <nums.size (); ++ i)
66 {
67 bool flag = false ;
68 para ( int j = 0 ; j <check_vec.size (); ++ j)
69 {
70 if (nums [i] == check_vec [j])
71 {
72 bandera = verdadero ;
73 }
74 }
75 if (! Flag)
76 {
77 result.push_back (nums [i]);
78 }
79 }
80 sort (result.begin (), result.end (), cmp);
81
82 for (vector < int > :: iterator it = result.begin (); it! = Result.end (); it ++ )
83 {
84 cout << * it;
85 if (it! = Result.end () - 1 )
86 {
87 cout << " " ;
88 }
89 }
90 devuelve 0 ;
91 }