Vacaciones de invierno 2020 [gmoj2174] [Bloque de construcción] [Simulación, Matemáticas]

Descripción del título

Weiwei tiene un volumen rectangular A × B × C, y los bloques están compuestos de 1 × 1 × 1 bloques pequeños. Establecemos la altura de este cuboide en A, el ancho en B y la longitud en C. (Por conveniencia, la longitud del cuboide no tiene que ser mayor que el ancho).
Ahora Weiwei ha cavado un pequeño cuboide (A-1) × (B-2) × (C-2) en la esquina superior izquierda de este cuboide. Y decirle que el volumen del cuboide que se extrajo es n, es decir, n = (A-1) × (B-2) × (C-2). Ahora le pregunto, después de extraer el cuboide pequeño, ¿cuáles son el número mínimo y máximo de pequeños bloques 1 × 1 × 1 que quedan en el volumen rectangular original? En otras palabras, con la premisa de decirle el valor de n, encuentre min {A × B × Cn} y max {A × B × Cn}.

De entrada

El archivo de entrada se llama block.in.
Ingrese un total de 1 línea, solo un entero positivo n.

Salida

El archivo de salida se llama block.out.
La línea de salida consta de dos enteros positivos separados por espacios, que a su vez representan el número mínimo de bloques pequeños restantes y el número máximo de bloques pequeños restantes.

Entrada de muestra

[Entrada de muestra 1]
4

[Entrada de muestra 2]
7

Salida de muestra

[Salida de muestra 1]
28 41

[Salida de muestra 2]
47 65

Limitación del rango de datos

Para el 100% de los datos 1 ≤ n ≤ 10 ^ 9

Pronto

Explicación de la muestra 1:
4 = (2-1) × (4-2) × (4-2) El bloque de construcción pequeño restante mínimo es 2 × 4 × 4-4 = 28 (en este caso, los valores de A, B y C son respectivamente Es 2,
4, 4) 4 = (5-1) × (3-2) × (3-2) Los bloques pequeños más restantes son 5 × 3 × 3-4 = 41 (en este momento A, B, C Los valores son 5, 3 y 3)

Análisis

De hecho, podemos encontrar c enumerando a y b, lo que puede salvar una dimensión. Solo agrega un poco de timbre.

Código en

#include<iostream>
#include<cstdio>
using namespace std;
long long n,mn=2147483647,mx,c;
int main()
{
	freopen("block.in","r",stdin);
	freopen("block.out","w",stdout);
	cin>>n;
	for(int a=1;a*a*a<=n;a++) //优化
	{
		if(n%a==0) //判断整除
		{
			for(int b=a;a*b*b<=n;b++)//优化 
			{
				if(n/a%b==0)
			    {
			  		c=n/a/b;//知道a,b就知道c 
			  		if(a*b*c==n)//所有情况 
			  		{
			   		    mn=min((a+1)*(b+2)*(c+2),mn);
						mn=min((a+2)*(b+1)*(c+2),mn);
					    mn=min((a+2)*(b+2)*(c+1),mn);
					    mx=max((a+1)*(b+2)*(c+2),mx);
					    mx=max((a+2)*(b+1)*(c+2),mx);
					    mx=max((a+2)*(b+2)*(c+1),mx);
			  		}
			    }
			}
		}
	} 
	cout<<mn-n<<" "<<mx-n;
	return 0;
}


Publicó 110 artículos originales · ganó 100 · visitó 8037

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/104803872
Recomendado
Clasificación