Skip to Content

Fence Painting

Análisis oficial (Java) 

Solución 1 (análisis por casos)

Solución

Complejidad temporal: O(1)\mathcal O(1)

Podemos partir en casos según los seis órdenes posibles de a,b,c,da,b,c,d. Los casos son:

  • aca\le c
    • b<cb<c
    • cb<dc\le b<d
    • dbd\le b
  • a>ca>c
    • d<ad<a
    • ad<ba\le d < b
    • bdb\le d

Para cada caso, la respuesta es una combinación lineal distinta de a,b,c,da,b,c,d.

Implementación

#include <iostream> void set_up(std::string name) { freopen((name + ".in").c_str(), "r", stdin); freopen((name + ".out").c_str(), "w", stdout); } int main() { set_up("paint"); int a, b, c, d; std::cin >> a >> b >> c >> d; if (a <= c) { if (b < c) { std::cout << b - a + d - c; } else if (b < d) { std::cout << d - a; } else { std::cout << b - a; } } else { if (d < a) { std::cout << b - a + d - c; } else if (d < b) { std::cout << b - c; } else { std::cout << d - c; } } }
import java.io.*; import java.util.*; public class FencePainting { public static void main(String[] args) throws Exception { Kattio io = new Kattio("paint"); int a = io.nextInt(); int b = io.nextInt(); int c = io.nextInt(); int d = io.nextInt(); if (a <= c) { if (b < c) { io.print(b - a + d - c); } else if (b < d) { io.print(d - a); } else { io.print(b - a); } } else { if (d < a) { io.print(b - a + d - c); } else if (d < b) { io.print(b - c); } else { io.print(d - c); } } io.close(); } // CodeSnip{Kattio} }
import sys sys.stdin = open("paint.in", "r") sys.stdout = open("paint.out", "w") def solve(a, b, c, d): if a <= c: if b < c: return b - a + d - c elif b < d: return d - a else: return b - a else: if d < a: return b - a + d - c elif d < b: return b - c else: return d - c a, b = map(int, input().split()) c, d = map(int, input().split()) print(solve(a, b, c, d))

Implementación condensada

Podemos simplificar la implementación de arriba reutilizando lógica entre casos. Por ejemplo,

  1. No hace falta tener cadenas de ifs separadas para los casos aca\ge c y a<ca<c. Si estamos en el segundo caso, podemos intercambiar los dos intervalos para transformarlo en el primero, sin cambiar la respuesta.

  2. Podemos reemplazar el if que compara bb y dd por max(b,d)\max(b,d).

#include <iostream> void set_up(std::string name) { freopen((name + ".in").c_str(), "r", stdin); freopen((name + ".out").c_str(), "w", stdout); } int main() { set_up("paint"); int a, b, c, d; std::cin >> a >> b >> c >> d; if (a > c) { std::swap(a, c); std::swap(b, d); } if (b < c) { std::cout << b - a + d - c; } else { std::cout << std::max(b, d) - a; } }
import java.io.*; import java.util.*; public class FencePainting { public static void main(String[] args) throws Exception { Kattio io = new Kattio("paint"); int a = io.nextInt(); int b = io.nextInt(); int c = io.nextInt(); int d = io.nextInt(); if (a > c) { int tempA = a; a = c; c = tempA; int tempB = b; b = d; d = tempB; } if (b < c) { io.print(b - a + d - c); } else { io.print(Math.max(b, d) - a); } io.close(); } // CodeSnip{Kattio} }
import sys sys.stdin = open("paint.in", "r") sys.stdout = open("paint.out", "w") def solve(a, b, c, d): if a > c: a, b, c, d = c, d, a, b if b < c: return b - a + d - c return max(b, d) - a a, b = map(int, input().split()) c, d = map(int, input().split()) print(solve(a, b, c, d))

Otras soluciones

Ver el módulo Geometría de rectángulos.