oj1026: número feo (colas de prioridad, y para encontrar la solución óptima)

Temas requisitos
humilde número es el número de factores primos 2,3,5,7 solamente cuatro, además de otros ya no contiene
otros factores primos.

Nota 1 examinó también el número de feo antes de 20 números feo es
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ...;
la entrada
por línea N, 1 <= N <= 5842, N . se satisface 0 entrada
la salida
. emite la-ésimo N número feo correspondiente
la Muestra la entrada
sin procesar
. 1
2
. 3
. 4
. 11
12 es
13 es
21 es
22 es
23 es
100
1000
5842
0
la muestrear la salida
sin procesar
. 1
2
. 3
. 4
12 es
14
15
28
30
32
450
385 875
2000000000.
Esta pregunta antes, sólo para descubrir si los números divisibles una poligonal convencional igual a 0, siempre visualizar el tiempo de espera. Hace poco vi un vector, juego, mapas y prioridad de la cola idea de último momento.
Muy fácil de hacer cuando la primera pasada, el número es un múltiplo de 2,3,5,7 feo, siempre y cuando el número mínimo de entre 1 comienza feos, con una cola de prioridad para mantener todos los números feos generada cada vez que el número mínimo tomado que se puede multiplicar por 2,3,5,7 naturales próximos feo, porque es una cola de prioridad, se puede disponer directamente desde pequeñas a grandes, por lo que debe tenerse en cuenta que las cifras se repetirán, a fin de recordar a ir fuerte. Por último, sólo sé que dado un número, se puede conocer el número de feo en la ubicación del.
El código completo

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#include<set>
#include<queue>

using namespace std;
typedef long long LL;
const int num[4]={2,3,5,7};

int main()
{
  priority_queue<LL,vector<LL>,greater<LL> >pq;//从小到大的优先队列
  set<LL>s;//set
  int n=1,t;
  int a[5844];
  pq.push(1);//插入刚开始的1
  s.insert(1);
  for(int i=1; ;i++)
  {
    LL x=pq.top();pq.pop();
    if(i==n)
    {
      a[n]=x;
      n++;
      if(n==5843)
        break;
    }
    for(int j=0;j<4;j++)
    {
      LL x2=x*num[j];
      if(!s.count(x2))
      {
        s.insert(x2);
        pq.push(x2);//不断更新队列
      }
    }
  }
  while(cin>>t)
  {
    if(t==0)break;
     cout<<a[t]<<endl;
  }
	return 0;
}

Más tarde, le preguntó acerca de la tercera edad cohorte de conocimiento, él dijo que yo no complicado. . .
Las ideas pueden ser utilizadas para encontrar la solución óptima, en primer lugar determinar la American National Standard [1] = 1, hay cuatro formas de obtener puntos 2,3,5,7 ans [1], donde elegirán 2. Así podemos determinar el segundo, tercero. . . .
Esta parte de las pegatinas de códigos

inline void init()
{
    ans[1] = 1;
    fill(p, p + 4, 1);//置1
    ll val;
    for(int i=2; i<=maxN; i++)
    {
        val = MIN_4(ans[p[0]] * 2LL, ans[p[1]] * 3LL, ans[p[2]] * 5LL, ans[p[3]] * 7LL);
        if(val == ans[p[0]] * 2LL) p[0]++;
        if(val == ans[p[1]] * 3LL) p[1]++;
        if(val == ans[p[2]] * 5LL) p[2]++;
        if(val == ans[p[3]] * 7LL) p[3]++;
        ans[i] = val;
    }
}
Publicado 38 artículos originales · ganado elogios 27 · vistas 3170

Supongo que te gusta

Origin blog.csdn.net/qq_45891413/article/details/105188027
Recomendado
Clasificación