solución de sistema monetario P5020 a un problema

vínculo del título original

Brevemente significado de las preguntas:

requisitos mínimos de la moneda de un equivalente de longitud determinada divisa. La longitud de este sistema de dinero petición. Ver las definiciones de la materia equivalente, no se repetirá.

Este artículo se puede utilizar un número de la teoría de conjuntos, por favor sea seguro para comer.

Un algoritmo

\ (N = 2 \) , se determina la única múltiplo de dos números. Existen múltiples relaciones, la respuesta es \ (1 \) , de lo contrario \ (2 \) .

complejidad del tiempo: \ (O (T \ n-Times) \) .

Puntuación real: \ \ (15pts) .

algoritmos de dos

\ (N = 3 \) , primero, si los dos números son múltiplos de otro número, entonces la respuesta es \ (1 \) .

De lo contrario, si todavía hay múltiples relaciones, la respuesta es \ (2 \) .

El resto del caso, sólo es necesario tener en cuenta, y el número mínimo de veces que un pequeño número podría indicar lo que el número máximo.

Se puede comparar a \ (2 \) , de lo contrario, \ (3 \) .

Hay muchas maneras de determinar. Por ejemplo:

  1. Violencia, directamente en cubos, \ (O (\ a_i max) \) .

  2. Considere la resolución de ecuaciones con \ (\ texttt {exgcd} \ ) de escritura, \ (O (\ log \ a_i max) \) .

En resumen, la complejidad del tiempo es \ (O (T \ n-Times \ Times (\ a_i max)) \) . (No hay necesidad de optimizar, no es necesario)

Puntuación real: \ \ (30pts) .

Algoritmo para tres

En primer lugar, asumir que dado \ (S \) , la respuesta es \ (T \) sin duda tiene:

\ [T \ in S \]

Vamos a probar esta conclusión.

Si \ (T \ no \ en S \) , se considera tomado \ (X = \ min (I \ in S) \) , \ (Y = \ min (I \ in T) \) .

Si \ (el X- <la y- \) , entonces \ (x \) no puede ser expresado.

Si \ (el y-> los ejes X \) , entonces \ (y \) no puede expresarse.

Si \ (la y-la X- = \) , y luego continuar la recursividad, se prueba.

Por lo tanto, sólo tenemos que encontrar la respuesta al sistema monetario determinado.

A continuación enumeramos respuestas seleccionadas, entonces de 11 años de verificación.

complejidad Tiempo: \ (O (2 ^ n- \ n-Times \ Times (\ a_i max) \ times T) \) , puede pasar.

Puntuación real: \ \ (65pts) .

Cuatro óptima

NOTA: \ (n-25 = \) , no pensé nada \ (O (2 ^ n \ tiempos T) \) había perdido algoritmos, por lo que esta parte del archivo se puede utilizar para dividir a los jugadores andar por ahí. ? ? ?

No ha encontrado necesario detenerse en. Primero hay que resolver.

Sólo tiene que utilizar el número existente de jueces actuales están haciendo actualmente este número se puede expresar.

¿Puede, entonces no hay necesidad de explicar este número, lo guardó.

De lo contrario, se debe elegir. El hecho de que, \ (> \) sus medios de números que no, y \ (<\) también dijo que no sólo que pueda expresarse, que deben elegir.

Así, se puede determinar únicamente si se ha seleccionado un número. (Ordenado de pequeño a elección)

¿Cómo puedo saber?

Encontramos que cada nueva adición de un número \ (los ejes X \) , se puede determinar la necesidad de mantener la cubeta.

En este caso, en el cubo original, cada número se puede expresar en \ (K \) , la \ (k + x, k + 2x, k + 3x \ cdots k + \ infty x \) todos como mayo juicio. Esto es obvio.

Como \ (\ infty \) límite superior, siempre que el estándar \ (\ a_i max \) puede ser, porque el número de la última inútil.

complejidad del tiempo: \ (O (n \ tiempos t \ Times (\ a_i max)) \) .

Puntuación real: \ (100 pts) \ .

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

const int N=5e4+1;

inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
	int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}

int T,n,a[N];
int cnt=0;
int maxi; bool h[N];

int main(){
	T=read(); while(T--) {
		n=read(); maxi=0; cnt=0;
		memset(h,0,sizeof(h)); //初始化
		for(int i=1;i<=n;i++) a[i]=read(),maxi=max(maxi,a[i]);
		sort(a+1,a+1+n); //排序
		for(int i=1;i<=n;i++)
			if(!h[a[i]]) { //不能被表示
				h[a[i]]=1; cnt++;
				for(int j=1;j<=maxi;j++)
					if(h[j]) {
						for(int k=a[i];j+k<=maxi;k+=a[i])
							h[j+k]=1;
					} //维护能被表示的桶
			} printf("%d\n",cnt);
	}
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/bifanwen/p/12576482.html
Recomendado
Clasificación