beecrowd 1291 · áreas de setores

Será Isso Integração?

Calcular três tipos de região formados por quatro arcos dentro de um quadrado, sem usar integração numérica.

álgebra + geometria

As três incógnitas

Chamaremos a parte listrada de A₁, a soma das regiões pontilhadas de A₂ e a soma dos cantos quadriculados de A₃. O lado do quadrado é a.

  • Quadrado: Aq = a².
  • Quarto de círculo: Ac = πa²/4.
  • Complementar: Ap = a² - Ac = (4-π)a²/4.
Quadrado com arcos, triângulo de 30 e 60 graus e segmento circular em destaque
Figura original: o setor verde fornece a quarta relação necessária para separar as áreas.

O segmento circular fecha o sistema

O triângulo destacado tem hipotenusa a, base a/2 e altura a√3/2. O setor possui 60°, isto é, dois terços de um quarto de círculo.

Asegmento = πa²/6 - a²√3/8 = a²(4π - 3√3)/24

As relações geométricas completas são:

Aq = A₁ + A₂ + A₃
Ac = A₁ + 3A₂/4 + A₃/2
Ap = A₂/4 + A₃/2
Asegmento = A₁/2 + A₂/4 + A₃/8

Isolando as três áreas:

A₃ = 8Asegmento + 8Ap - 4Aq
A₂ = 4Ap - 2A₃
A₁ = Aq - A₂ - A₃

Como as áreas escalam

A₁listrada
A₂pontilhada
A₃quadriculada
Área do quadrado
Segmento circular
A₁ + A₂ + A₃

O ponto-chave

Todas as áreas são uma constante multiplicada por . Ao dobrar o lado, cada resultado quadruplica, mas a proporção mostrada na faixa permanece igual.

TempoO(1)
MemóriaO(1)
Saída3 casas
Sistema resolvidoAbrir 1291.py
import math
import sys


def calcular_areas(lado):
    # Todas as fórmulas-base são proporcionais ao quadrado do lado.
    quadrado = lado * lado
    quarto_de_circulo = math.pi * quadrado / 4.0
    complementar = quadrado - quarto_de_circulo
    segmento = (
        quadrado * (4.0 * math.pi - 3.0 * math.sqrt(3.0)) / 24.0
    )

    # As combinações isolam as três regiões pedidas pelo desenho.
    quadriculada = 8.0 * segmento + 8.0 * complementar - 4.0 * quadrado
    pontilhada = 4.0 * complementar - 2.0 * quadriculada
    listrada = quadrado - pontilhada - quadriculada
    return listrada, pontilhada, quadriculada


def main():
    # Existe um valor de lado por caso, e a entrada termina em EOF.
    lados = map(float, sys.stdin.buffer.read().split())
    respostas = [
        f"{listrada:.3f} {pontilhada:.3f} {quadriculada:.3f}"
        for listrada, pontilhada, quadriculada in map(calcular_areas, lados)
    ]
    sys.stdout.write("\n".join(respostas) + "\n")


if __name__ == "__main__":
    main()

Fontes e validação