TopCoder Open 2019 izaicinājums: sagrieziet pīrāgu seŔos gabalos

TopCoder Open 2019 izaicinājums: sagrieziet pīrāgu seŔos gabalos
Pa pēdām ā€œMÅ«sējie uzvarēja: TopCoder Open 2019ā€ Es publicēju problēmas no Algoritma celiņa (klasiskā sporta programmÄ“Å”ana. Pusotras stundas laikā jāatrisina trÄ«s uzdevumi Java, C#, C++ vai Python valodā.)

1. Pīrāgs seŔiem

Problēmas paziņojums

Laika ierobežojums ir 4 sekundes.

Jums ir pÄ«rāgs. Skatoties no augÅ”as, kÅ«kai ir (stingri) izliekta daudzstÅ«ra forma. Jums tiek dotas virsotņu koordinātas X un Y veselos skaitļos.

Tev ir pieci draugi. JÅ«s vēlaties sadalÄ«t pÄ«rāgu seÅ”os vienāda laukuma gabalos (bet ne vienmēr vienāda forma). Protams, ikviens var to izdarÄ«t piecos griezumos, bet tikai profesionālis to var izdarÄ«t trÄ«s griezumos.

Atrodiet trÄ«s iegriezumus taisnās lÄ«nijās caur vienu punktu, kas sadalÄ«s pÄ«rāgu seŔās vienādās daļās. Drukāt {x, y, d1, d2, d3}, kur (x, y) ir visu trÄ«s griezumu kopējais punkts, un d1, d2, d3 ir griezumu virziena leņķi radiānos.

DefinīcijaKlase: CakeForSix
Metode: sagriezt
Parametri: int[], int[] Atgriež: double[] Metodes paraksts: double[] cut(int[] x, int[] y)
(pārliecinieties, ka jūsu metode ir publiska)

piezīmes

  • PozitÄ«vais virziens pa x asi ir 0 (radiānos), pozitÄ«vais virziens pa y asi ir pi/2 (radiānos).
  • Izgriezums d virzienā ir lÄ«dzÄ«gs izgriezumam pi*k+d virzienā jebkuram veselam skaitlim k.
  • JÅ«s varat izvadÄ«t jebkurus virzienus, tiem nav jābÅ«t no [0, pi).
  • Greideris aprēķinās jÅ«su seÅ”u kÅ«kas gabalu laukumu dubultā. Atbilde tiks pieņemta, ja relatÄ«vā vai absolÅ«tā atŔķirÄ«ba starp tām ir mazāka par 10^(-4).
  • PrecÄ«zāk, ļaujiet X un Y bÅ«t mazākajiem un lielākajiem no jÅ«su seÅ”iem laukumiem, ko aprēķinājis greiders. Tad jÅ«su atbilde tiks pieņemta, ja Y
  • (Sākotnējā problēmas versijā tika izmantota precizitāte 1e-7, nevis 1e-4. Lai atrisinātu Å”o problēmu arhÄ«vā, precizitātes ierobežojums tika pazemināts, jo bija izsaukÅ”anas gadÄ«jumi, kas, iespējams, padarÄ«tu problēmu neatrisināmu ar precizitāti. no 1e-7. Ideālā pasaulē ierobežojumi nepieļauj Ŕādus gadÄ«jumus un joprojām prasa augstu precizitāti, tāpēc problēmas risināŔana ar vispārÄ«gu skaitlisku optimizāciju nav vienkārÅ”a.)

Ierobežojumi

  • x satur no 3 lÄ«dz 50 elementiem ieskaitot.
  • y satur tādu paÅ”u elementu skaitu kā x.
  • visas koordinātas no 0 lÄ«dz 10 000 ieskaitot
  • x un y definē izliektu daudzstÅ«ri pretēji pulksteņrādÄ«tāja virzienam.

oriģināls angļu valodā

Problēmas izklāsts

Laika ierobežojums ir 4 sekundes.

Jums ir kÅ«ka. Skatoties no augÅ”as, kÅ«ka ir (stingri) izliekts daudzstÅ«ris. Jums tiek dotas tā virsotņu koordinātas int[]sx un y.

Tev ir pieci draugi. Tagad vēlaties kÅ«ku sagriezt seÅ”os vienāda laukuma gabalos (bet ne vienmēr vienādas formas). Protams, ikviens to var izdarÄ«t piecos griezumos, taču tikai Ä«sts profesionālis to var izdarÄ«t trÄ«s!

Atrodiet trÄ«s taisnas lÄ«nijas griezumus, kas iet caur to paÅ”u punktu, kas sagriež kÅ«ku seŔās vienādi lielās daļās. AtgrieÅ”anās {x, y, d1, d2, d3}, kur (x, y) ir trÄ«s griezumu kopējais punkts, un d1, d2, d3 ir to virzieni radiānos.

Definīcija

Klase: CakeForSix
Metode: sagriezt
Parametri: int[], int[] Atgriež: double[] Metodes paraksts: double[] cut(int[] x, int[] y)
(pārliecinieties, ka jūsu metode ir publiska)

Piezīmes
ā€” PozitÄ«vais virziens pa x asi ir 0 (radiānos), pozitÄ«vais virziens pa y asi ir pi/2 (radiānos).
ā€” Griezums virzienā d ir tāds pats kā griezums virzienā pi*k+d jebkuram veselam skaitlim k.
ā€” Varat atgriezt jebkurus norādÄ«jumus, tiem nav jābÅ«t no [0,pi).
ā€” Greideris aprēķinās jÅ«su seÅ”u kÅ«kas gabalu laukumus dubultā. Atbilde tiks pieņemta, ja relatÄ«vā vai absolÅ«tā atŔķirÄ«ba starp tām ir mazāka par 10^(-4).
ā€” PrecÄ«zāk, ļaujiet X un Y bÅ«t mazākajiem un lielākajiem no seÅ”iem laukumiem, ko aprēķinājis greiders. Pēc tam jÅ«su atbilde tiks pieņemta, ja Y < max( X + 10^(-4), X * (1+10^(-4)) ).
ā€” (Sākotnējā uzdevuma versijā tika izmantota precizitāte 1e-7, nevis 1e-4. Å Ä«s problēmas risināŔanai arhÄ«vā precizitātes robeža tika pazemināta, jo pastāvēja izaicinājuma gadÄ«jumi, kas, visticamāk, padara uzdevumu neatrisināmu ar precizitāti 1e-7 Ideālā pasaulē ierobežojumi nepieļautu Ŕādus gadÄ«jumus un joprojām prasa augstu precizitāti, tāpēc problēmu nav viegli atrisināt, izmantojot vispārēju skaitlisko optimizāciju.)

Ierobežojumi
ā€” x bÅ«s no 3 lÄ«dz 50 elementiem, ieskaitot.
ā€” y bÅ«s tāds pats elementu skaits kā x.
ā€” Visas koordinātas bÅ«s no 0 lÄ«dz 10,000 XNUMX ieskaitot.
ā€” x un y apraksta izliektu daudzstÅ«ri pretēji pulksteņrādÄ«tāja virzienam.

piemēri

0)

{0, 20, 30, 50, 30, 20}
{10, 0, 0, 10, 20, 20}
Atgriežas:
{24.999999999437453, 9.999999999500002, 0.0, 0.7266423406817211, 2.4149503129080787 }

Simetrisks, bet neregulārs seÅ”stÅ«ris. Atbildes piemērs atbilst tā pārgrieÅ”anai uz pusēm horizontāli un divu citu izgriezumu veikÅ”anai centrā, kas sadala katru gabalu trÄ«s daļās.

TopCoder Open 2019 izaicinājums: sagrieziet pīrāgu seŔos gabalos

1)

{0, 1000, 0}
{0, 0, 1000}
Atgriežas:
{333.3333333331763, 333.3333333332546, 0.7853981633986264, 2.0344439357948154, 2.6779450445891753 }

Taisns trīsstūris. Atkal mēs varam sākt ar vienu no trim griezumiem pa simetrijas asi.

TopCoder Open 2019 izaicinājums: sagrieziet pīrāgu seŔos gabalos

2)

{40, 70, 90, 90, 50}
{30, 20, 40, 100, 60}
Atgriežas:
{69.79517771922892, 52.77575974637605, 2.0616329654335885, 3.637826104091601, 4.32123485812475 }

Neregulārs piecstūris.

TopCoder Open 2019 izaicinājums: sagrieziet pīrāgu seŔos gabalos

3)

{300, 400, 300, 200}
{500, 600, 700, 600}
AtgrieŔana: {299.99999999974995, 599.9999999995, 0.0, 1.107148717794088, 2.034443935795705 }

Kvadrāts pagriezts par 45 grādiem.

TopCoder Open 2019 izaicinājums: sagrieziet pīrāgu seŔos gabalos

[Avots]

Aptaujā var piedalīties tikai reģistrēti lietotāji. Ielogoties, lūdzu.

Es atrisināju problēmu par

  • mazāk nekā 10 minÅ«tēs

  • 10-30 minÅ«tes

  • 30-60 minÅ«tes

  • 1-2 stundas

  • vairāk nekā 2 stundu laikā

  • cits

Nobalsoja 42 lietotāji. 47 lietotāji atturējās.

Avots: www.habr.com

Pievieno komentāru