El ganado fuera de dos DFS

1. Portal: Ganado de pasajeros 13594- elegir la dislexia

 

El significado de los problemas: se k artículos son, para cada tipo de artículo tiene una [i] ap cada elemento tiene un valor, elegir un máximo de cada categoría de artículos, cuántos ley electoral requiere que el valor total> m (no se requiere para cada tipo de artículo debe ser seleccionado)

Solución: Es claro que un DFS el problema, pero a la poda de optimización, asumiendo nuestra vaule total actual todos los artículos> m, entonces solo cuente el número total de combinaciones después de que los elementos de la lista ( prestar especial atención a cada categoría de artículos no pueden votar, es decir num [0] = 0, el número dfs 0 posición de cada categoría de artículos desde el inicio, en vez de 1 ), con una matriz de mul para registrar el número de cada tipo de programa.

código:

1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algoritmo>
 6 #include <pila>
 7 #include <cola>
 8 #include <vector>
 9 # incluir <mapa>
 10 #include < conjunto >
 11 #include <unordered_set>
 12 #include <unordered_map>
13  #define ll largo, largo
 14  #define fi primera
 15  #define SE segundo
 16  #define pb push_back
 17 #define me memset
 18  const  int N = 1E6 + 10 ;
19  const  int mod = 1e9 + 7 ;
20  usando  espacio de nombres std;
21 par typedef < int , int > PII;
22 typedef par < largo , largo > PLL;
23  
24  int k;
25 ll m, American National Standard, un [ 20 ] [ 200 ], mul [ 20 ], num [ 200 ];
26  
27  
28 void DFS ( int pos, suma ll) {
 29      si (pos> k) de retorno ;
30       para ( int i = 0 ; i <= num [pos]; ++ i) {
 31           si (A [pos] [i] + sum> m) {
 32               ans + = (num [pos] -i + 1 ) * mul [pos + 1 ];
33               de retorno ;
34           }
 35           dfs (pos + 1 , sum + un [pos] [i]);
36       }
 37  }
 38  
39  int main () {
 40     ios :: sync_with_stdio ( falso );
41       , mientras que (cin >> k >> m) {
 42           para ( int i = 1 ; i <= k; ++ i) {
 43               cin >> num [i];
44               para ( int j = 1 ; j <= num [i]; ++ j) {
 45                   cin >> a [i] [j];
46               }
 47               sort (a [i] + 1 , a [i] + 1 + num [i]);
48           }
 49           ans = 0 ;
50          mul [k + 1 ] = 1 ;
51           para ( int i = k; i> = 1 ; - i) mul [i] = mul [i + 1 ] * (num [i] + 1 );
52           dfs ( 1 , 0 );
53          printf ( " % LLD \ n " , ans);
54       }
 55  
56      de retorno  0 ;
57 }

 

2. Portal: Ganado de pasajeros 14132- Belem Castelnuovo rocío 

 

 Significado de las preguntas: P. ¿Es posible llegar a ser una matriz en dos matrices idénticas (elementos deben ser seleccionados de la sub-secuencia)

Solución: violenta de búsqueda directa, [ne] representa el a1 I valor actual o A2 que se añade a, si es igual a 1, a 2 a continuación, dar, o para A1 (A2 que puso el número de espera no ver nunca a1), Si la longitud a1 o a2 es> n / 2, no se describirá esta forma de realización, ya que en cualquier caso el primer número de devolución a un cierto a1, por lo que los dfs directos (1,0,2) .;

código:

1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algoritmo>
 6 #include <pila>
 7 #include <cola>
 8 #include <vector>
 9 # incluir <mapa>
 10 #include < conjunto >
 11 #include <unordered_set>
 12 #include <unordered_map>
13  #define ll largo, largo
 14  #define fi primera
 15  #define SE segundo
 16  #define pb push_back
 17 #define me memset
 18  const  int N = 1E6 + 10 ;
19  const  int mod = 1e9 + 7 ;
20  usando  espacio de nombres std;
21 par typedef < int , int > PII;
22 typedef par < largo , largo > PLL;
23  
24  int t;
25  int n, a [N];
26  int a1 [N], a2 [N];
27  
28  bool dfs ( int P1, intp2, int ne) {
 29      si (p1> n / 2 || p2> n / 2 ) de retorno  falsa ;
30      Si (ne == n + 1 ) regresan  verdadera ;
31      si (a [ne] == a1 [p2 + 1 ]) {
 32          a2 [p2 + 1 ] = a [ne];
33          si (DFS (p1, p2 + 1 , ne + 1 )) de regreso  verdadera ;
34      }
 35      a1 [p1 + 1 ] = a [ne];
36      de retornodfs (p1 + 1 , p2, ne + 1 );
37  }
 38  
39  int main () {
 40      ios :: sync_with_stdio ( falso );
41      cin >> t;
42       , mientras que (t-- ) {
 43           cin >> n;
44            para ( int i = 1 ; i <= n; ++ i) cin >> a [i];
45  
46            A1 [ 1 ] = a [ 1 ];
47            si (DFS ( 1 , 0 , 2 )) printf (" Frederica Bernkastel \ n " );
48            otra cosa printf ( " Furude Rika \ n " );
49  
50       }
 51  
52      de retorno  0 ;
53 }

 

Supongo que te gusta

Origin www.cnblogs.com/lr599909928/p/12670811.html
Recomendado
Clasificación