Izazov TopCoder Open 2019: isecite pitu na šest delova

Izazov TopCoder Open 2019: isecite pitu na šest delova
U tragovima “Naši su pobijedili: TopCoder Open 2019” Objavljujem probleme iz Algoritma (klasično sportsko programiranje. Za sat i po potrebno je riješiti tri problema u Javi, C#, C++ ili Pythonu.)

1. Pita za šest

Izjava o problemu

Vremensko ograničenje je 4 sekunde.

Imate pitu. Kada se gleda odozgo, kolač ima oblik (strogo) konveksnog poligona. Date su vam koordinate vrhova u X i Y cijelim brojevima.

Imaš pet prijatelja. Želite da podijelite pitu na šest komada jednake površine (ali ne nužno istog oblika). Naravno, svako to može učiniti u pet rezova, ali samo profesionalac to može učiniti u tri reza.

Nađite tri ravne linije kroz jednu tačku koje će podijeliti pitu na šest jednakih dijelova. Odštampajte {x, y, d1, d2, d3}, gdje je (x, y) zajednička tačka sva tri reza, a d1, d2, d3 su uglovi smjera rezova u radijanima.

definicijaKlasa: CakeForSix
Metoda: cut
Parametri: int[], int[] Povrati: double[] Potpis metode: double[] cut(int[] x, int[] y)
(uvjerite se da je vaša metoda javna)

Napomene

  • Pozitivan smjer duž x-ose je 0 (radijani), pozitivni smjer duž y-ose je pi/2 (radijani).
  • Rez u pravcu d je sličan rezu u pravcu pi*k+d za bilo koji cijeli broj k.
  • Možete ispisati bilo koje smjernice, ne moraju biti od [0, pi).
  • Ocjenjivač će izračunati površinu vaših šest komada torte u parovima. Odgovor će biti prihvaćen ako je relativna ili apsolutna razlika između njih manja od 10^(-4).
  • Preciznije, neka X i Y budu najmanji i najveći od vaših šest površina koje je izračunao grejder. Tada će vaš odgovor biti prihvaćen ako Y
  • (Originalna verzija problema koristila je preciznost 1e-7 umjesto 1e-4. Da bi se riješio ovaj problem u arhivi, granica preciznosti je smanjena zbog prisustva pozivanja slučajeva koji bi vjerovatno učinili problem nerješivim s preciznošću od 1e-7. U idealnom svijetu, granice ne dopuštaju takve slučajeve i još uvijek zahtijevaju visoku preciznost, tako da rješavanje problema nekom općom numeričkom optimizacijom nije lako.)

Ograničenja

  • x sadrži od 3 do 50 elemenata uključujući.
  • y sadrži isti broj elemenata kao i x.
  • sve koordinate između 0 i 10 uključujući
  • x i y definiraju konveksni poligon u smjeru suprotnom od kazaljke na satu.

Original na engleskom

Izjava o problemu

Vremensko ograničenje je 4 sekunde.

Imate tortu. Gledano odozgo, torta je (strogo) konveksan poligon. Date su vam koordinate njegovih vrhova u int[]sx i y.

Imaš pet prijatelja. Sada želite da isečete tortu na šest delova jednake površine (ali ne nužno istog oblika). Naravno, svako to može učiniti u pet rezova — ali samo pravi profesionalac to može učiniti u tri!

Nađite tri pravolinijska reza koja prolaze kroz istu tačku i koja je rezala tortu na šest jednako velikih dijelova. Povratak {x, y, d1, d2, d3}, gdje je (x, y) zajednička tačka tri rezanja, a d1, d2, d3 su njihovi smjerovi u radijanima.

definicija

Klasa: CakeForSix
Metoda: cut
Parametri: int[], int[] Povrati: double[] Potpis metode: double[] cut(int[] x, int[] y)
(uvjerite se da je vaša metoda javna)

bilješke
— Pozitivan smjer duž ose x je 0 (radijani), pozitivni smjer duž y ose je pi/2 (radijani).
— Rez u pravcu d je isti kao rez u pravcu pi*k+d za bilo koji ceo broj k.
— Možete vratiti bilo koje upute, ne moraju biti od [0,pi).
— Grejder će izračunati površine vaših šest komada kolača u duplo. Odgovor će biti prihvaćen ako je relativna ili apsolutna razlika između njih manja od 10^(-4).
— Preciznije, neka X i Y budu najmanja i najveća od vaših šest oblasti, kako je izračunao grejder. Tada će vaš odgovor biti prihvaćen ako je Y < max( X + 10^(-4), X * (1+10^(-4))).
— (Originalna verzija problema koristila je preciznost 1e-7 umjesto 1e-4. Za rješavanje ovog problema u arhivi granica preciznosti je smanjena zbog postojanja izazovnih slučajeva koji najvjerovatnije čine zadatak nerješivim sa preciznošću 1e-7 U idealnom svijetu ograničenja ne bi dopuštala takve slučajeve i još uvijek zahtijevaju 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 i x.
— Sve koordinate će biti između 0 i 10,000, uključujući.
— x i y će opisati konveksni poligon u smjeru suprotnom od kazaljke na satu.

primjeri

0)

{0, 20, 30, 50, 30, 20}
{10, 0, 0, 10, 20, 20}
Povratak:
{24.999999999437453, 9.999999999500002, 0.0, 0.7266423406817211, 2.4149503129080787 }

Simetričan, ali nepravilan šestougao. Primjer odgovora odgovara vodoravnom rezanju na pola i pravljenju dva druga reza po sredini koji dijele svaki komad na tri dijela.

Izazov TopCoder Open 2019: isecite pitu na šest delova

1)

{0, 1000, 0}
{0, 0, 1000}
Povratak:
{333.3333333331763, 333.3333333332546, 0.7853981633986264, 2.0344439357948154, 2.6779450445891753 }

Pravokutni trokut. Opet, možemo početi s jednim od tri reza duž ose simetrije.

Izazov TopCoder Open 2019: isecite pitu na šest delova

2)

{40, 70, 90, 90, 50} {XNUMX} {XNUMX}
{30, 20, 40, 100, 60} {XNUMX} {XNUMX}
Povratak:
{69.79517771922892, 52.77575974637605, 2.0616329654335885, 3.637826104091601, 4.32123485812475 }

Nepravilan pentagon.

Izazov TopCoder Open 2019: isecite pitu na šest delova

3)

{300, 400, 300, 200}
{500, 600, 700, 600}
Povrati: {299.99999999974995, 599.9999999995, 0.0, 1.107148717794088, 2.034443935795705 }

Kvadrat zarotiran za 45 stepeni.

Izazov TopCoder Open 2019: isecite pitu na šest delova

[Izvor]

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite semolim.

Rešio sam problem za

  • za manje od 10 minuta

  • 10-30 minuta

  • 30-60 minuta

  • 1-2 sati

  • za više od 2 sata

  • drugi

Glasalo je 42 korisnika. Uzdržano je bilo 47 korisnika.

izvor: www.habr.com

Dodajte komentar