Algoritmo para mejorar la Lotería

Las limitaciones de recursos
Plazo: 1,0 s Límite de memoria: 256.0MB
Descripción del problema
  Para enriquecer Festival macho, se proporciona caro parte hembra lotería basado, las reglas son las siguientes:
  1, cada billete de lotería impreso en siete números diferentes, y estos números están en el intervalo [1, 33];
  2, cada veces antes de la concesión de los números ganadores se darán a conocer por la diferente siete de cada número de otro un consiste en;
  3, se establecieron siete premios, gran premio y el primer premio a Liu Dengjiang. Duijiang reglas son las siguientes:
  Gran Premio: Solicitud siete números en la lotería de números en ganar;
  primer premio: Requiere seis números en la lotería de números ganadores aparecerán en;
  el segundo premio: cinco números aparecen en los requisitos de la lotería en los números ganadores;
  ......
  Liu Dengjiang: los números en la reivindicación 1 aparece en los números ganadores de la lotería;
  Nota: el orden no aparece en número, por ejemplo, si el número ganador es 2331114191718, la lotería 128 9.231.167 debido a lo cual hay dos números (23 y 1) aparecen en los números ganadores de la lotería por lo que el quinto premio.
  Se sabe que una serie de números y los números ganadores de la lotería para comprar Li Hua, por favor, escribir un programa para determinar su bote de la lotería.
Formato de entrada
  La primera línea de un número entero positivo n, el número de billetes de lotería, una segunda línea de número entero de siete representa los números ganadores, números enteros n para cada línea de fila 7 siguientes, n lotería.
Formato de salida
  7 espacio números separados, el primer número indica el número de hojas de ganar el premio, los dos primeros números indican el número de hojas de ganar el primer premio, los tres primeros números indican el número de ganar segundo premio en el séptimo ...... números ganadores indican el número de hojas Liu Dengjiang.
entrada de la muestra
3
1 2 3 4 5 6 7
11 12 13 14 15 16 17
12 13 14 15 16 17 18
8 7 10 9 31 30 29
Ejemplo de salida
0 0 0 0 0 0 1
datos de la escala y convenciones
  30% de los datos de n - <= 100;
  70% de los datos n - <= 1000;
  100% de datos n <= 100.000.

  ***** Nota: la matriz se define como una variable global, se puede asignar más memoria. *****
Un pensamiento: para abrir una matriz de iteración violenta
1 #include <stdio.h>
 2  
3  int lotteryNum [ 100000 ] [ 7 ] = { 0 };
4  
5  int main ()
 6  {
 7      int n;
8      int prizeNumer [ 7 ] = { 0 };
9      int prizeYorN [ 7 ] = { 0 };
10      int i, j, k;
11  
12      scanf ( " % d " , y n);
13      para (i = 0 ; i <7 ; i ++ )
 14      {
 15          scanf ( " % d " , y prizeNumer [i]);
16      }
 17      para (i = 0 ; i <n; i ++ )
 18      {
 19          para (j = 0 ; j < 7 ; j ++ )
 20          {
 21              scanf ( " % d " , y lotteryNum [i] [j]);
22          }
 23      }
 24      
25      para (i = 0; I <n-; I ++)   // un ciclo ha varios lotería 
26 es      {
 27          int ANS = 0 ;
 28          para (J = 0 ; J < . 7 ; J ++)   // uno por uno de 
29          {
 30              para (K = 0 ; K < . 7 ; K ++)   // para cada traverse billete de lotería 
31 es              {
 32                  IF (prizeNumer [J] == lotteryNum [I] [K])
 33 es                  {
 34 es                      ANS ++ ;
 35                  }
 36              }
37          }
 38          de conmutador (años)
 39          {
 40          casos  7 : prizeYorN [ 0 ] + = 1 ;
41              descanso ;
42          cuadro  6 : prizeYorN [ 1 ] + = 1 ;
43              descanso ;
44          cuadro  5 : prizeYorN [ 2 ] + = 1 ;
45              descanso ;
46          cuadro  4 : prizeYorN [ 3 ] + = 1 ;
47              descanso ;
48          caso  3 : prizeYorN [ 4 ] + = 1 ;
49              rotura ;
50          caso  2 : prizeYorN [ 5 ] + = 1 ;
51              descanso ;
52          caso  1 : prizeYorN [ 6 ] + = 1 ;
53          }
 54      }
 55  
56      para (i = 0 ; i < 7 ; i ++ )
 57      {
 58          printf ( " % d ", PrizeYorN [i]);
59      }
 60      de retorno  0 ;
61 }

Pensando en dos: no hay necesidad de abrir grandes matrices, abre toda una serie de f se inicializa a 1, y luego sólo una vez atravesada la lotería, directo a las tablas de consulta, si  f [i] == 1 , la  SUMA ++ , y luego usar el p [sum] recuento, finalmente, salida p inversa [suma].

Tiempo de ejecución de complejidad son dos ideas O (N), pero significativamente menor uso de memoria segunda idea.

 

 1 #include<stdio.h>
 2 
 3 int f[33], p[10], n, m;
 4 int main()
 5 {
 6     scanf("%d",&n);
 7     for (int i = 0; i < 7; i++)
 8     {
 9         scanf("%d", &m);
10         f[m] = 1;
11     }
12     for (int i = 1; i <= n; i++)
13     {
14         int sum = 0;//中奖号码数量
15         for (int j = 1; j <= 7; j++)
16         {
17             scanf("%d", &m);
18             if (f[m] == 1)
19                 sum++;
20         }
21         p[sum]++;
22     }
23     for (int i = 7; i >= 1; i--)
24         printf("%d", p[i]);
25     return 0;
26 }

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/ZhengLijie/p/12652004.html
Recomendado
Clasificación