2751 - BB Security

De la Universitas MediaWiki

Domnul X lucrează la BB Security ca paznic.

Deoarece în România sunt foarte puțini hoți, acesta s-a gândit într-o zi să calculeze distanța dintre fiecare doi stâlpi de îngrădire din instituția pe care o păzește. Fiecare doi stâlpi de îngrădire sunt legați printr-un cablu rezistent, care, de obicei nu stă întins la maximum.

Din cauză ca în instituție se găsesc mulți stâlpi, domnul X vă provoacă pe voi să calculați ce și-a propus el.

Cerința

Se dă un număr n și n triplete de forma l, c, h, reprezentând lungimea egala a doi stâlpi, lungimea cablului dintre acestea și înălțimea la care atârnă cablul față de podea.

Se cere să se afle distanța dintre fiecare doi stâlpi.

Fiecare rezultat va fi afișat pe cate un rând nou.

Date de intrare

Programul citește de la tastatură un număr n și apoi n triplete de forma l, c, h, cu semnificația de mai sus.

Date de ieșire

Programul va afișa pe linia n a ecranului un număr de forma x care reprezintă lungimea dintre cei doi stâlpi, corespunzătoare datelor de pe linia n+1 din consola de citire, cu exact două zecimale, indiferent de caz, rotunjind a doua zecimală în comparație cu cea de-a treia, sau, dacă a doua zecimală este 5, zecimala a doua va crește cu o unitate doar dacă există încă una sau mai multe zecimale după cea de-a treia și măcar una din ele este > 0 (vezi Restricții).

Restricții și precizări

  • 1 ≤ n ≤ 100.000;
  • cele n numere citite vor fi mai mici decât 1.000.000;
  • n, l, c, h sunt numere naturale;
  • este garantat că pentru orice triplet citit există un număr 0 ≤ x ≤ c;
  • cea de-a doua zecimala se rotunjește de obicei după cea de-a treia (ex. 49.4376 se va afișa ca 49.44);
  • a| a ∈ ℕ, acesta se va afișa ca a.00 (ex. 50 se va afișa ca 50.00);
  • Atenție! 23.455 = 23.45 , 23.45501 = 23.46.

Exemplul 1

Input:

2

60 100 20

100 50 100

Output:

49.44

50.00

Explicație:

Pentru primul triplet lungimea dintre cei doi stâlpi este 49.44, iar pentru al doilea cablul este întins la maximum și lungimea dintre cei doi stâlpi este 50.00.

Exemplul 2

Input:

1

34 7.2 9.1

Output:

Numerele trebuie să fie naturale.

Rezolvare

import math

def verifica_conditii(n, tests):
    results = []
    
    for i in range(n):
        l, c, h = tests[i]
        
        # Verificare dacă numerele sunt naturale
        if not all(map(lambda x: x.is_integer() and x >= 0, [l, c, h])):
            results.append("Numerele trebuie să fie naturale.")
            continue

        if h == l:
            results.append(f"{int(c):.2f}")
        elif c / 2 + h == l:
            results.append("0.00")
        else:
            a = ((c**2 / 4) - (l - h)**2) / (2 * (l - h))
            t1 = 2 * a * math.log(math.sqrt((c**2 / 4) / (a**2) + 1) + (c / 2) / a)
            
            # Rotunjirea valorilor conform specificațiilor
            rounded_t1 = round(t1, 2)
            if rounded_t1.is_integer():
                results.append(f"{int(rounded_t1)}.00")
            else:
                results.append(f"{rounded_t1:.2f}")

    return results

def main():
    n = int(input())
    tests = []
    
    for _ in range(n):
        l, c, h = map(float, input().split())
        tests.append((l, c, h))
    
    results = verifica_conditii(n, tests)
    for result in results:
        print(result)

if __name__ == "__main__":
    main()