Cómo resolver SPOJ.com – Problema GERGOVIA en SPOJ

Este problema admite una solución codiciosa O (N).

Suponga que x₁, x₂ son ubicaciones de dos casas que desean vender vino, e y₁, y₂ son ubicaciones de dos casas que desean comprar vino de manera tal que x₁ <x₂ e y₁ <y₂. El núcleo de la solución radica en darse cuenta de que nunca es mejor enviar una unidad de vino de x₁ a y₂ y una unidad de x₂ a y₁ que enviar una unidad de x₁ a y₁ y una unidad de x₂ a y₂. Es decir, tiene sentido enviar vino del vendedor de la izquierda al comprador de la izquierda y así sucesivamente.

El problema se puede resolver de esta manera: localice el vendedor más a la izquierda y envíe la mayor cantidad de vino posible / requerida al primer comprador. Si al vendedor no le queda vino después de esto, pase al siguiente vendedor. Alternativamente, si se ha cumplido el requisito del comprador, pase al siguiente comprador. Siga haciendo esto hasta que todo el vino haya sido transferido de los vendedores a los compradores. Como las ubicaciones de las casas ya se han proporcionado en orden, esto se puede hacer en O (N).

Aquí está el pseudocódigo:

  def mincost (N, a [])
 {
   ret = 0
   vendedor = 0, comprador = 0
   mientras que (1)
   {
     while (vendedor  = 0) vendedor ++;
     while (comprador <N y un [comprador] <= 0) comprador ++;
     si (vendedor == N o comprador == N) se rompe;

     transacción = min (un [comprador], - un [vendedor]);
     ret + = transacción;
     un [comprador] - = transacción;
     una [vendedor] + = transacción;
   }

   volver ret;
 }

A continuación se muestra mi solución aceptada.
Esta pregunta se basa en el enfoque codicioso. La mía es la solución de O (n).
Dado que cada elemento es necesario para convertirse en cero, solo siga acumulando el trabajo total. Supongamos que el primer elemento no es cero, entonces debe transferirse al siguiente elemento, por lo que, ya sea positivo o negativo, debe transferirlo todo. Y el trabajo será el valor absoluto del elemento transferido.
De esta manera solo necesita resumirlo hasta el último término y obtendrá el trabajo total.

#include using namespace std; int main() { int n,i; scanf("%d",&n); while(n!=0) { long int a[n]; for(i=0;i 

Happy Coding 🙂

More Interesting

¿Existen tipos de programas de software que involucren matemáticas, pero que puedan resolver problemas cotidianos (es decir, no un motor de juego de física completo o un nuevo algoritmo criptográfico)?

Cómo usar el 'mapa combinatorio' de una triangulación de un polígono 2D para probar si un borde dado de la triangulación es un borde límite

¿Qué algoritmos existen para la reconstrucción de un conjunto de vectores de un diccionario de cardinalidad más pequeña?

¿Hay algún modelo físico o fenómeno que permita resolver rápidamente los problemas NP-hard?

¿Qué viene después de aprender la biblioteca de plantillas estándar, las estructuras de datos y los algoritmos en C ++?

Cómo mostrar que la distancia más corta entre 2 curvas que no se cruzan siempre se encuentra a lo largo de su normal común

Cómo encontrar la ruta más corta en un gráfico no ponderado en lenguaje C

¿Qué tan preciso es el algoritmo de predicción de personalidad de Faception?

¿Cuál es la relación de recurrencia para el tipo de selección?

¿Es una buena idea aprender algoritmos antes de los conceptos de OOP en la programación de Python?

¿Qué es un algoritmo para aprender nuevos lenguajes de programación?

Cómo hacer un software de árbol de decisiones más interactivo

¿Cuántas conjeturas necesitarías para determinar el número entre 1 y 100 en el peor de los casos usando una búsqueda lineal?

¿Cuál es la ecuación general para calcular la probabilidad de encontrar una cadena de longitud N en una cadena M más larga de caracteres aleatorios, cada uno elegido de {AZ}?

Cómo entender el análisis amortizado del algoritmo