TopCoder Open 2019-útdaging: snij de taart yn seis stikken

TopCoder Open 2019-útdaging: snij de taart yn seis stikken
Yn 'e fuotstappen "Us wûn: TopCoder Open 2019" Ik publisearje problemen út de Algorithm spoar (klassike sportprogrammearring. Yn oardel oere moatte jo trije problemen oplosse yn Java, C#, C++ of Python.)

1. Pie foar seis

Probleemintwurding

De tiidlimyt is 4 sekonden.

Jo hawwe in pie. Fan boppen besjoen hat de taart de foarm fan in (strings) bolle polygoon. Jo wurde jûn de koördinaten fan de hoekpunten yn X en Y hiele getallen.

Jo hawwe fiif freonen. Jo wolle it pie diele yn seis stikken fan gelikense gebiet (mar net needsaaklik deselde foarm). Fansels kin elkenien it dwaan yn fiif besunigings, mar allinich in pro kin it yn trije besunigings dwaan.

Fine trije besunigings yn rjochte linen troch ien punt dat sil ferdiele de taart yn seis gelikense dielen. Print {x, y, d1, d2, d3}, dêr't (x, y) is it mienskiplike punt fan alle trije besunigings, en d1, d2, d3 binne de rjochtingshoeken fan de besunigings yn radialen.

DefinysjeKlasse: CakeForSix
Metoade: snije
Parameters: int[], int[] Jout werom: dûbel[] Metoade hântekening: dûbel[] cut(int[] x, int[] y)
(wês der wis fan dat jo metoade iepenbier is)

Notysjes

  • De positive rjochting lâns de x-as is 0 (radianen), de positive rjochting lâns de y-as is pi/2 (radianen).
  • In besuniging yn 'e d-rjochting is fergelykber mei in besuniging yn' e pi*k+d-rjochting foar elk hiel getal k.
  • Jo kinne elke rjochting útfiere, se hoege net te wêzen fan [0, pi).
  • De grader sil it gebiet fan jo seis stikken koeke yn dûbele berekkenje. It antwurd sil wurde akseptearre as it relative of absolute ferskil tusken harren is minder as 10 ^ (-4).
  • Mear krekter, lit X en Y de lytste en grutste fan jo seis gebieten wêze, berekkene troch de grader. Dan sil jo antwurd wurde akseptearre as Y
  • (De orizjinele ferzje fan it probleem brûkte in krektens fan 1e-7 ynstee fan 1e-4. Om dit probleem yn it argyf op te lossen, waard de presyslimyt ferlege troch de oanwêzigens fan opropgefallen dy't it probleem wierskynlik ûnoplosber meitsje soene mei in krektens fan 1e-7. Yn in ideale wrâld, de grinzen net tastean sokke gefallen en noch easkje hege presyzje, dus it oplossen fan it probleem mei guon algemiene numerike optimalisaasje is net maklik.)

Beskikberens

  • x befettet út 3 oan 50 eleminten ynklusyf.
  • y befettet itselde oantal eleminten as x.
  • alle koördinaten tusken 0 en 10 ynklusyf
  • x en y definiearje in konvex polygoan yn tsjin de klok yn rjochting.

Orizjineel yn it Ingelsk

Probleemferklearring

Tiid limyt is 4 sekonden.

Jo hawwe in taart. Sjoen fan boppen is de koeke in (strings) bolle polygoan. Jo krije de koördinaten fan har hoekpunten yn 'e int[]sx en y.

Jo hawwe fiif freonen. Jo wolle no de taart yn seis stikken fan gelikense gebiet snije (mar net needsaaklikerwize gelikense foarm). Fansels kin elkenien dat dwaan yn fiif besunigings - mar allinich in echte pro kin it yn trije dwaan!

Fyn trije rjochte-line besunigings dy't troch itselde punt passe dy't de taart yn seis like grutte dielen snije. Werom {x, y, d1, d2, d3}, wêrby't (x, y) it mienskiplike punt is fan 'e trije besunigings, en d1, d2, d3 har rjochtingen yn radialen binne.

Definysje

Klasse: CakeForSix
Metoade: snije
Parameters: int[], int[] Jout werom: dûbel[] Metoade hântekening: dûbel[] cut(int[] x, int[] y)
(wês der wis fan dat jo metoade iepenbier is)

Notes
- De positive rjochting lâns de x-as is 0 (radianen), de positive rjochting lâns de y-as is pi/2 (radianen).
- In besuniging yn rjochting d is itselde as in besuniging yn rjochting pi*k+d foar elk hiel getal k.
- Jo kinne alle rjochtingen weromjaan, se hoege net fan [0,pi) te wêzen.
- De grader sil de gebieten fan jo seis cake stikken yn dûbele berekkenje. It antwurd sil wurde akseptearre as it relative of absolute ferskil tusken harren is minder as 10 ^ (-4).
- Mear krekter, lit X en Y de lytste en de grutste fan jo seis gebieten wêze, lykas berekkene troch de grader. Dan sil jo antwurd wurde akseptearre as Y < max( X + 10^(-4), X * (1+10^(-4))).
- (De oarspronklike ferzje fan it probleem brûkte 1e-7-precision ynstee fan 1e-4. Foar it oplossen fan dit probleem yn it argyf waard de presyslimyt ferlege troch it bestean fan útdagingsfallen dy't de taak nei alle gedachten ûnoplosber meitsje mei 1e-7-precision Yn in ideale wrâld soene de beheiningen sokke gefallen net tastean en noch hege presyzje fereaskje, sadat it net maklik is om it probleem op te lossen fia wat algemiene numerike optimalisaasje.)

Beperkingen
- x sil hawwe tusken 3 en 50 eleminten, ynklusyf.
- y sil itselde oantal eleminten hawwe as x.
- Alle koördinaten sille wêze tusken 0 en 10,000, ynklusyf.
- x en y sille in konvex polygoan beskriuwe yn tsjin de klok yn folchoarder.

foarbylden

0)

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

In symmetryske mar unregelmjittige hexagon. It foarbyldantwurd komt oerien mei it horizontaal yn 'e helte snije en twa oare besunigingen yn it sintrum meitsje dy't elk stik yn trije dielen ferdiele.

TopCoder Open 2019-útdaging: snij de taart yn seis stikken

1)

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

Rjochts trijehoek. Nochris kinne wy ​​​​begjinne mei ien fan trije besunigingen lâns de symmetry-as.

TopCoder Open 2019-útdaging: snij de taart yn seis stikken

2)

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

Unregelmjittich fiifhoeke.

TopCoder Open 2019-útdaging: snij de taart yn seis stikken

3)

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

In fjouwerkant draaide 45 graden.

TopCoder Open 2019-útdaging: snij de taart yn seis stikken

[Boarne]

Allinnich registrearre brûkers kinne meidwaan oan 'e enkête. Ynlogge, asjebleaft.

Ik oplost it probleem foar

  • yn minder dan 10 minuten

  • 10-30 minuten

  • 30-60 minuten

  • 1-2 oeren

  • yn mear as 2 oeren

  • oare

42 brûkers stimden. 47 brûkers ûntholden har.

Boarne: www.habr.com

Add a comment