Suponga que usará exactamente monedas [matemáticas] k [/ matemáticas]. ¿Qué cantidades puedes pagar?
Claramente, la cantidad más pequeña que puede pagar es [math] ka [/ math] y la cantidad más grande es [math] kb [/ math]. ¿Qué pasa con las cantidades entre estos dos valores? Resulta que también puedes pagar a cada uno de ellos. (La prueba está abajo).
Por lo tanto, debemos verificar si una cantidad dada [matemática] n [/ matemática] se encuentra en el intervalo [matemática] [ka, kb] [/ matemática] para alguna [matemática] k [/ matemática]. En otras palabras, debemos tener [math] ka \ leq n [/ math] y también [math] n \ leq kb [/ math].
- ¿Cuáles son algunas habilidades de programación, algoritmos o marcos que se ven muy bien pero que son muy simples?
- ¿Puedo hacer un generador de algoritmos en C / C ++? Por generador de algoritmos me refiero a un programa que pide entrada y salida esperada y, sobre la base de eso, proporciona la lógica del programa.
- ¿Es más difícil probar la corrección de algoritmos codiciosos que probar la corrección de cualquier otra clase de algoritmos?
- ¿Cuál es el mejor algoritmo para encontrar dos elementos iguales en una matriz?
- ¿Cuál es la solución eficiente para SPOJ CCROSSX?
Dado que [math] k [/ math] es un número entero, debemos tener [math] k \ leq \ lfloor n / a \ rfloor [/ math] y [math] k \ geq \ lceil n / b \ rceil [ /mates]. (Los paréntesis extraños representan la función de piso y techo, respectivamente).
Cualquiera de esas [matemáticas] k [/ matemáticas] nos da una solución válida. Por lo tanto, la solución completa es verificar si [math] \ lceil n / b \ rceil \ leq \ lfloor n / a \ rfloor [/ math].
(El tutorial de Codeforces utiliza un paso intermedio: primero calcula la mayor [matemática] k [/ matemática] como [matemática] \ lfloor n / a \ rfloor [/ matemática], y luego verifica si esto [matemática] k [/ matemáticas] también satisface la otra desigualdad.)
Prueba de que podemos pagar todos los valores en [math] [ka, kb] [/ math]:
Una forma de pagar exactamente [matemáticas] p [/ matemáticas], donde [matemáticas] ka \ leq p \ leq kb [/ matemáticas], es usar exactamente [matemáticas] p \ bmod k [/ matemáticas] monedas por valor de [matemáticas] (p \ mathop {\ rm div} k) +1 [/ math] each, y [math] k- (p \ bmod k) [/ math] monedas por valor de [math] (p \ mathop {\ rm div} k ) [/ math] cada uno.
En otras palabras, escribamos [matemáticas] p = kq + r [/ matemáticas]. Si tuviéramos que usar [math] k [/ math] monedas por valor de [math] q [/ math] cada una, pagaríamos [math] kq [/ math]. Para pagar [matemática] r [/ matemática] más, aumentaremos el valor de [matemática] r [/ matemática] de nuestras monedas en 1.
El argumento anterior también se puede visualizar muy bien. Imagina hacer agujeros [matemáticos] k [/ matemáticos] en el suelo, dispuestos en un círculo. Ahora toma las canicas [math] p [/ math] y comienza a caminar alrededor del círculo. Cada vez que encuentre un agujero, coloque una canica adentro. Cuando te quedas sin canicas, los conteos de canicas en los agujeros son los valores de las monedas que debes usar. Tenga en cuenta que generalmente también hay muchas otras soluciones: simplemente reorganice las canicas de cualquier manera, de modo que ningún hoyo tenga menos de [math] a [/ math] o más de [math] b [/ math] de ellas.