TopCoder Open 2019 ĂŒlesanne: jagame piruka kuueks osaks

TopCoder Open 2019 ĂŒlesanne: jagame piruka kuueks osaks
JĂ€lgedel «Meie vĂ”itsime: TopCoder Open 2019» jagan ĂŒlesandeid Algoritmi rajalt (klassikaline spordiprogrammeerimine. Poolteist tundi peab lahendama kolm ĂŒlesannet Java, C#, C++ vĂ”i Pythoniga.)

1. Kook kuuendale

Ülesande seadmine

Aja piirang – 4 sekundit.

Teil on kook. Kui vaadata pealt, on kook (rangelt) konvexse hulknurga kujuline. Teil on antud tippude koordinaadid tÀisarvudena X ja Y.

Teil on viis sĂ”pra. Soovite jagada kooki kuue vĂ”rdselt suure (aga mitte tingimata sama kuju) osaks. Loomulikult suudab igaĂŒks selle viie lĂ”ikega teha, kuid ainult pro suudab seda teha kolme lĂ”ikega.

Leidke kolm lĂ”iget sirgete joontega lĂ€bi ĂŒhe punkti, mis jagavad kooki kuue vĂ”rdselt suure osa. Tagastage {x, y, d1, d2, d3}, kus (x, y) on kĂ”igi kolme lĂ”ike ĂŒhispunkt ja d1, d2, d3 on lĂ”ikude suunad radiaanides.

MÀÀratlusKlass: CakeForSix
Meetod: cut
Parameetrid: int[], int[]
Tagastab: double[]
Meetodi allkiri: double[] cut(int[] x, int[] y)
(veenduge, et teie meetod on avalik)

MĂ€rkused

  • Positiivne suund mööda x telge on 0 (radian), positiivne suund mööda y telge on pi/2 (radian).
  • LĂ”ige suunal d on samasugune nagu lĂ”ige suunal pi*k+d iga tervete arvu k korral.
  • Saate esitada mis tahes suundi, need ei pea olema tingimata vahemikus [0, pi).
  • Grader arvutab teie kuue torditĂŒki pindalad doubles. Vastus on aktsepteeritud, kui suheline vĂ”i absoluutne erinevus nende vahel on vĂ€iksem kui 10^(-4).
  • TĂ€psemalt öeldes, las X ja Y olla teie kuue ala, mille grader on arvutanud, vĂ€ikseim ja suurim. Siis on teie vastus aktsepteeritud, kui Y < max(X + 10^(-4), X * 1 + 10^(-4)).
  • (Probleemi algses versioonis oli tĂ€psus 1e-7 asemel 1e-4. Selle probleemi lahendamiseks arhiivis tĂ€psuse piirmÀÀra vĂ€hendamine toimus, kuna oli juhtumeid, mis tĂ”enĂ€oliselt muudavad ĂŒlesande lahendamise 1e-7 tĂ€psusega vĂ”imatuks. Ideaalsetes tingimustes ei tohi piirangud selliseid juhtumeid lubada ja nad peaksid endiselt nĂ”udma kĂ”rget tĂ€psust, seega ei ole selle probleemi lahendamine mingi ĂŒldise numbrilise optimeerimise abil lihtne.)

Piirangud

  • x sisaldab 3 kuni 50 elementi (kaasa arvatud).
  • y sisaldab sama palju elemente kui x.
  • kĂ”ik koordinaadid vahemikus 0 kuni 10 000 (kaasa arvatud)
  • x ja y defineerivad kumerat mitmekĂŒlgset vastupĂ€eva.

Originaal inglise keeles

Probleemi kirjeldus

Aja limiit on 4 sekundit.

Sul on tort. ÜlhÀÀlt vaadates on tort (tĂ€pselt) kumer polĂŒgoon. Teile on antud selle tipude koordinaadid int[] massiivides x ja y.

Sul on viis sĂ”pra. NĂŒĂŒd soovid torti lĂ”igata kuue vĂ”rdsest pindalast tĂŒkiks (aga mitte tingimata vĂ”rdsest kujundist). Loomulikult on vĂ”imalik seda teha viie lĂ”ikega — kuid ainult tĂ”eline professionaal suudab seda kolm korda teha!

Leia kolm sirgjoonelist lĂ”iget, mis lĂ€bivad sama punkti ja lĂ”ikavad tordi kuue vĂ”rdsesse suurusesse ossa. Tagasta {x, y, d1, d2, d3}, kus (x, y) on kolme lĂ”ike ĂŒhine punkt ning d1, d2, d3 on nende suunad radiaanides.

MÀÀratlus

Klass: CakeForSix
Meetod: cut
Parameetrid: int[], int[]
Tagastab: double[]
Meetodi allkiri: double[] cut(int[] x, int[] y)
(veenduge, et teie meetod on avalik)

MĂ€rkused
— Positiivne suund x-teljel on 0 (radianit), positiivne suund y-teljel on pi/2 (radianit).
— LĂ”ige suunas d on sama, mis lĂ”ige suunas pi*k+d, kus k on mis tahes tĂ€isarv.
— Sa vĂ”id tagastada ĂŒkskĂ”ik millised suunad, need ei pea olema vahemikus [0, pi).
— Hinnataja arvutab sinu kuue torditĂŒki pindalad kahekĂŒmne tĂ€psusega. Vastus vĂ”etakse vastu, kui suheline vĂ”i absoluutne erinevus nende vahel on vĂ€iksem kui 10^(-4).
— TĂ€psemalt, olgu X ja Y sinu kuue pindala vĂ€ikseim ja suurim, nagu hinnataja on arvutanud. Siis vĂ”etakse sinu vastus vastu, kui Y < max(X + 10^(-4), X * (1 + 10^(-4))).
— (Probleemi originaalversioon kasutas 1e-7 tĂ€psust, mitte 1e-4. Selle probleemi arhiveerimise tĂ€henduses alandati tĂ€psuse piirangut, kuna eksisteerivad vĂ€ljakutsed, mis tĂ”enĂ€oliselt muudavad ĂŒlesande lahendamise 1e-7 tĂ€psusega impossibeilikuks. Ideaalses maailmas ei tohiks piirangud lubada selliseid juhtumeid ja samas nĂ”uda kĂ”rget tĂ€psust, et probleemi ei oleks kerge lahendada mĂ”ne ĂŒldise arvutuskohandamise kaudu.)

Piirangud
— x massiivis on 3 kuni 50 elementi, sealhulgas.
— y massiivis on sama palju elemente kui x.
— KĂ”ik koordinaadid jÀÀvad vahemikku 0 kuni 10,000, sealhulgas.
— x ja y kirjeldavad kumerat polĂŒgooni vastupĂ€eva suunas.

NĂ€ited

0)

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

SĂŒmmeetriline, aga mitte Ă”ige kuusniit. Vastuse nĂ€ide vastab sellele, kui jagada see horisontaalselt kahel pooleks ja teha kaks muud kĂ€rbet keskel, mis jagavad iga osa kolmeks osaks.

TopCoder Open 2019 ĂŒlesanne: jagame piruka kuueks osaks

1)

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

TĂ”rvikute kolmnurk. Taaskord, saame alustada ĂŒhe kolmest lĂ”ikest sĂŒmmeetriatelje mööda.

TopCoder Open 2019 ĂŒlesanne: jagame piruka kuueks osaks

2)

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

Vale viiekand.

TopCoder Open 2019 ĂŒlesanne: jagame piruka kuueks osaks

3)

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

Ruut, pööratud 45 kraadi.

TopCoder Open 2019 ĂŒlesanne: jagame piruka kuueks osaks

[Allikas]

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, palun.

Lahendasin ĂŒlesande

  • vĂ€hem kui 10 minutiga

  • 10-30 minutit

  • 30-60 minutit

  • 1-2 tundi

  • rohkem kui 2 tundi

  • muu

HÀÀletas 42 kasutajat. NÔustusid 47 kasutajat.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster