Zadatak s TopCoder Open 2019: režeći tortu na šest dijelova

Zadatak s TopCoder Open 2019: režeći tortu na šest dijelova
U tragovima „Naši su pobijedili: TopCoder Open 2019“ objavljujem zadatke iz Algoritamske staze (klasično sportsko programiranje. Za sat i pol potrebno je riješiti tri zadatka na Javi, C#, C++ ili Pythonu.)

1. Pita za šestero

Postavljanje zadatka

Maksimalno vrijeme — 4 sekunde.

Imate pitu. Kada je gledate odozgo, pita ima oblik (strogo) konveksnog mnogokuta. Dani su vam koordinate vrhova u cijelim brojevima X i Y.

Imate pet prijatelja. Želite podijeliti pitu na šest dijelova jednake površine (ali ne nužno jednakih oblika). Naravno, svatko može to učiniti s pet rezova, ali samo profesionalac može to učiniti s tri reza.

Pronađite tri rezna pravca kroz jednu točku koja će podijeliti pitu na šest dijelova jednake površine. Ispišite {x, y, d1, d2, d3}, gdje su (x, y) zajednička točka svih triju rezova, a d1, d2, d3 su kutovi smjera rezova u radijanima.

DefinicijaKlasa: CakeForSix
Metoda: cut
Parametri: int[], int[]
Vraća: double[]
Potpis metode: double[] cut(int[] x, int[] y)
(provjerite je li vaša metoda javna)

Napomene

  • Pozitivni smjer duž osi x iznosi 0 (radijan), pozitivan smjer duž osi y iznosi pi/2 (radijan).
  • Rez u smjeru d sličan je rezu u smjeru pi*k+d za bilo koji cijeli broj k.
  • Možete prikazati bilo koje smjerove, oni ne moraju nužno biti unutar [0, pi).
  • Grader će izračunati površine vaših šest komadića torte u doubles. Odgovor će biti prihvaćen ako je relativna ili apsolutna razlika između njih manja od 10^(-4).
  • Točnije, neka X i Y budu najmanje i najveće od vaših šest područja, izračunatih od strane gradjera. Tada će vaš odgovor biti prihvaćen ako je Y < max(X + 10^(-4), X * 1 + 10^(-4))).
  • (U izvornoj verziji zadatka korištena je točnost 1e-7 umjesto 1e-4. Da bi se riješio ovaj problem, u arhivi je granica točnosti smanjena zbog slučajeva poziva koji će vjerojatno učiniti zadatak neizvedivim s točnošću 1e-7. U idealnom svijetu ograničenja ne bi dopuštala takve slučajeve i još uvijek ne bi zahtijevala visoku točnost, pa je rješavanje problema s nekom općom numeričkom optimizacijom teško.)

Ograničenja

  • x sadrži od 3 do 50 elemenata uključivo.
  • y sadrži jednako toliko elemenata koliko i x.
  • sve koordinate između 0 i 10 000 uključivo
  • x i y definiraju konveksni mnogokotnik u smjeru suprotnom od kazaljke na satu.

Izvorna verzija na engleskom

Izjava o problemu

Maksimalno vrijeme je 4 sekunde.

Imate tortu. Gledajući odozgo, torta je (strogo) konveksni polygon. Dobivate koordinate njezinih vrhova u int[]x i y.

Imate pet prijatelja. Sada želite izrezati tortu na šest komada jednake površine (ali ne nužno jednakog oblika). Naravno, svatko to može učiniti sa pet rezova — ali samo pravi profesionalac to može učiniti u tri!

Pronađite tri ravna reza koja prolaze kroz istu točku i dijele tortu na šest jednakih dijelova. Vratite {x, y, d1, d2, d3}, gdje je (x, y) zajednička točka triju rezova, a d1, d2, d3 su njihovi smjerovi u radijanima.

Definicija

Klasa: CakeForSix
Metoda: cut
Parametri: int[], int[]
Vraća: double[]
Potpis metode: double[] cut(int[] x, int[] y)
(provjerite je li vaša metoda javna)

Napomene
— Pozitivan smjer duž x osi je 0 (radijani), pozitivan smjer duž y osi je pi/2 (radijani).
— Rez u smjeru d je isti kao rez u smjeru pi*k+d za bilo koji cijeli broj k.
— Možete vratiti bilo kakve smjerove, ne moraju biti iz [0,pi).
— Grader će izračunati površine vaših šest dijelova torte u doubleovima. Odgovor će biti prihvaćen ako je relativna ili apsolutna razlika između njih manja od 10^(-4).
— Preciznije, neka su X i Y najmanja i najveća od vaših šest površina, kako ih izračunava grader. Tada će vaš odgovor biti prihvaćen ako Y < max(X + 10^(-4), X * (1+10^(-4))).
— (Izvorna verzija problema koristila je preciznost 1e-7 umjesto 1e-4. Kako bi se ovaj problem riješio u arhivi, granica preciznosti je snižena zbog postojanja izazovnih slučajeva koji najvjerojatnije čine zadatak nerješivim s 1e-7 preciznosti. U idealnom svijetu, uvjeti ne bi trebali dopuštati takve slučajeve i još zahtijevati visoku preciznost, tako da nije lako riješiti problem putem neke opće numeričke optimizacije.)

Ograničenja
— x će imati između 3 i 50 elemenata, uključujući.
— y će imati isti broj elemenata kao x.
— Sve koordinate bit će između 0 i 10.000, uključujući.
— x i y će opisivati konveksni polygon u suprotnom smjeru kazaljke na satu.

Primjeri

0)

{0, 20, 30, 50, 30, 20}
{10, 0, 0, 10, 20, 20}
Vraća:
{24.999999999437453, 9.999999999500002, 0.0, 0.7266423406817211, 2.4149503129080787 }

Simetričan, ali ne pravilan heksagon. Primjer odgovora odgovara rezanju preko horizonta i izvršavanju dvije druge rezove kroz sredinu, koje dijele svaki dio na tri dijela.

Zadatak s TopCoder Open 2019: režeći tortu na šest dijelova

1)

{0, 1000, 0}
{0, 0, 1000}
Vraća:
{333.3333333331763, 333.3333333332546, 0.7853981633986264, 2.0344439357948154, 2.6779450445891753 }

Pravokutni trokut. Ponovno, možemo početi s jednim od triju rezova duž osi simetrije.

Zadatak s TopCoder Open 2019: režeći tortu na šest dijelova

2)

{40, 70, 90, 90, 50}
{30, 20, 40, 100, 60}
Vraća:
{69.79517771922892, 52.77575974637605, 2.0616329654335885, 3.637826104091601, 4.32123485812475 }

Nepravilan peterokut.

Zadatak s TopCoder Open 2019: režeći tortu na šest dijelova

3)

{300, 400, 300, 200}
{500, 600, 700, 600}
Vraća: {299.99999999974995, 599.9999999995, 0.0, 1.107148717794088, 2.034443935795705}

Kvadrat, rotiran za 45 stupnjeva.

Zadatak s TopCoder Open 2019: režeći tortu na šest dijelova

[Izvor]

Samo registrirani korisnici mogu sudjelovati u anketi. Prijavite se, molimo.

Riješio sam zadatak za

  • manje od 10 minuta

  • 10-30 minuta

  • 30-60 minuta

  • 1-2 sata

  • više od 2 sata

  • drugo

Glasalo je 42 korisnika. Suzdržalo se 47 korisnika.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster