Fişierul intrare/ieşire:snooker.in, snooker.outSursăJunior Challenge 2012
AutorVlad GavrilaAdăugată dejuniorcJunior Challenge juniorc
Timp execuţie pe test0.1 secLimită de memorie20480 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Snooker

Ronnie "The Rocket" O'Sullivan a înţeles în sfârşit că şi tacticile defensive sunt utile în jocul de snooker. Pentru a exersa, Ronnie şi-a cumpărat o masă de dimensiuni (N+2)*(M+2), fără buzunare, şi un set format dintr-o bilă albă şi K bile roşii, toate având raza 1. Colţul din stânga-jos al mesei are coordonatele (-1, -1) iar colţul dreapta-sus are coordonate (N+1, M+1). Observăm astfel că o bilă plasată in colţul stânga-jos va avea centrul la coordonatele (0, 0), iar o bilă plasată in colţul dreapta-sus va avea centrul la coordonatele (N, M).

Ronnie se va antrena în felul următor: el plasează cele K bile roşii pe masă, toate în puncte de coordonate naturale. Apoi, Ronnie îşi alege două puncte A şi B de coordonate naturale (Xa, Ya), respectiv (Xb, Yb). El plasează bila albă cu centrul în punctul A şi încearcă să o lovească cu tacul astfel încât, după ce rulează pe masă, ea să se oprească cu centrul în punctul B, fără să atingă vreuna din bilele roşii. Din cauza aranjamentului bilelor roşii, se poate ca lovitura să nu se poată efectua direct, ci doar cu manta. Masa cumpărată de Ronnie este de o calitate superioară, încât bila albă sare din mantă sub acelaşi unghi sub care a fost lovită (vezi figura).

Cerinţă

Dându-se N, M, coordonatele punctelor A şi B, numărul K de bile roşii precum şi coordonatele acestora, să se determine unghiul sub care trebuie să fie lovită bila albă, astfel încăt să nu atingă nicio bilă roşie, iar centrul ei să ajungă în punctul B.

Date de intrare

Fişierul de intrare snooker.in va conţine pe prima linie şase numere naturale: N, M, Xa, Ya, Xb, Yb. Pe a doua linie se va afla numărul natural K. Pe fiecare dintre următoarele K linii se va afla o pereche de numere (x, y) reprezentând coordonatele unei bile roşii.

Date de ieşire

În fişierul de ieşire snooker.out se va afişa un număr real, reprezentând măsura în radiani a unghiului sub care Ronnie trebuie să lovească bila albă.

Restricţii

  • 10 ≤ N, M ≤ 100
  • 1 ≤ K ≤ 50
  • Toate numerele din datele de intrare sunt naturale.
  • Manta se defineşte ca fiind marginea înălţată a mesei, mai exact conturul dreptunghiului cu colţurile în punctele (-1, -1) şi (N+1, M+1).
  • Se garantează că pentru fiecare din teste există o soluţie pentru care bila albă loveşte manta de maxim 5 ori.
  • Se va accepta orice soluţie pentru care bila albă loveşte manta de maxim 10 ori şi nu atinge nicio bilă roşie înainte să ajungă în punctul B.
  • Se consideră că bila albă atinge o bilă roşie dacă distanţa de la centrul bilei roşii la traiectoria bilei albe este mai mică strict decât 2 (de două ori raza 1).
  • Rezultatul se va verifica cu o precizie de 0.0001.

  • Important! Pentru afişarea răspunsului se recomandă utilizarea funcţiei atan2(y, x) din librăria cmath, pentru programatorii C/C++, sau a funcţiei arctan2(y, x), pentru programatorii Pascal. Ambele funcţii primesc parametrii y şi x şi returnează valoarea în radiani a unghiului facut de punctul (x, y) cu originea (0, 0). Având un punct (X, Y) aflat pe traiectoria iniţială a bilei albe (dinainte de lovirea unei mante) şi punctul (Xa, Ya), răspunsul pe care trebuie să îl afişaţi este atan2(Y-Ya, X-Xa) sau arctan2(Y-Ya, X-Xa). Mai multe detalii despre cele 2 functii gasiti pe C++ Reference şi pe FreePascal.org

Praguri de punctaj

  • Pentru 20% din teste, lovitura se poate efectua direct.
  • Pentru alte 20% din teste, lovitura trebuie efectuată cu minim o mantă.
  • Pentru alte 15% din teste, lovitura trebuie efectuată cu minim două mante.
  • Pentru alte 15% din teste, lovitura trebuie efectuată cu minim trei mante.
  • Pentru alte 15% din teste, lovitura trebuie efectuată cu minim patru mante.
  • Pentru alte 15% din teste, lovitura trebuie efectuată cu minim cinci mante.

Exemplu

snooker.insnooker.out
10 10 5 0 4 7
2
8 5
5 5
2.176341

Explicaţie

Există 4 răspunsuri corecte: -2.480549, 2.480549, -2.176341, 2.176341 (corespunzătoare unghiurilor -142.09, 142.09, -124.68 si respectiv 124.68 de grade). Deoarece bila albă se află chiar lângă mantă, dacă lovim sub un unghi negativ (înspre mantă), bila alba va sări imediat şi va urma traiectoria dată de valoarea în modul a unghiului. Astfel, primele două răspunsuri corespund traiectoriei albastre, iar ultimele două corespund traiectoriei portocalii.

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?