
I spÄren av jag publicerar uppgifter frÄn spÄret Algorithm (klassisk sportprogrammering. Inom en och en halv timme mÄste tre uppgifter lösas i Java, C#, C++ eller Python.)
1. TÄrta för sex
UppgiftsstÀllande
TidsgrĂ€ns â 4 sekunder.
Du har en tÄrta. Om du tittar uppifrÄn har tÄrtan formen av (strikt) en konvex polygon. Du fÄr koordinaterna för hörnen i hela tal X och Y.
Du har fem vÀnner. Du vill dela tÄrtan i sex delar med lika areal (men inte nödvÀndigtvis lika mycket form). SjÀlvklart kan vem som helst göra detta pÄ fem skÀrningar, men endast en proffs kan göra det pÄ tre skÀrningar.
Hitta tre skÀrningar med raka linjer genom en punkt som delar tÄrtan i sex delar med lika mycket areal. Skriv ut {x, y, d1, d2, d3}, dÀr (x, y) Àr den gemensamma punkten för alla tre skÀrningarna, och d1, d2, d3 Àr vinklarna för skÀrningarna i radianer.
DefinitionKlass: CakeForSix
Metod: cut
Parametrar: int[], int[]
Returnerar: double[]
Metodsignatur: double[] cut(int[] x, int[] y)
(se till att din metod Àr public)
Anteckningar
- Det positiva riktningen lÀngs x-axeln Àr 0 (radianer), det positiva riktningen lÀngs y-axeln Àr pi/2 (radianer).
- En skÀrning i riktningen d Àr likvÀrdig med en skÀrning i riktningen pi*k+d för varje heltal k.
- Du kan returnera valfria riktningar, de behöver inte nödvÀndigtvis ligga inom [0, pi).
- Graderaren kommer att berÀkna areorna för dina sex bitar av tÄrta som doubles. Svaret kommer att accepteras om den relativa eller absoluta skillnaden mellan dem Àr mindre Àn 10^(-4).
- Mer specifikt, lÄt X och Y vara de minsta och största av dina sex omrÄden, berÀknade av graderaren. DÄ kommer ditt svar att accepteras om Y <max (X+10^(-4), X*1+10^(-4))).
- (I den ursprungliga versionen av uppgiften anvÀndes en noggrannhet pÄ 1e-7 istÀllet för 1e-4. För att lösa detta problem sÀnktes noggrannhetsgrÀnsen i arkivet pÄ grund av förekomsten av fall som sannolikt gör uppgiften olöslig med en noggrannhet pÄ 1e-7. I en ideal vÀrld tillÄter begrÀnsningarna inte sÄdana fall och krÀver fortfarande hög noggrannhet, sÄ att ÄtgÀrda problemet med nÄgon allmÀn numerisk optimering Àr inte enkelt.)
BegrÀnsningar
- x innehÄller mellan 3 och 50 element inklusive.
- y innehÄller lika mÄnga element som x.
- alla koordinater mellan 0 och 10 000 inklusive
- x och y definierar en konvex polygon i moturs riktning.
Originalet pÄ engelska
ProblemstÀllning
TidsgrÀnsen Àr 4 sekunder.
Du har en tÄrta. Sedd frÄn ovan Àr tÄrtan en (strikt) konvex polygon. Du fÄr koordinaterna för dess hörn i int[]-arrayerna x och y.
Du har fem vĂ€nner. Du vill nu dela tĂ„rtan i sex delar med lika area (men inte nödvĂ€ndigtvis lika form). SjĂ€lvklart kan vem som helst göra det med fem snitt â men bara en riktig proffs kan göra det med tre!
Hitta tre raka snitt som gÄr genom samma punkt och som delar tÄrtan i sex lika stora delar. à tervÀnd {x, y, d1, d2, d3}, dÀr (x, y) Àr den gemensamma punkten för de tre snitten, och d1, d2, d3 Àr deras riktningar i radianer.
Definition
Klass: CakeForSix
Metod: cut
Parametrar: int[], int[]
Returnerar: double[]
Metodsignatur: double[] cut(int[] x, int[] y)
(se till att din metod Àr public)
Anteckningar
â Den positiva riktningen lĂ€ngs x-axeln Ă€r 0 (radianer), den positiva riktningen lĂ€ngs y-axeln Ă€r pi/2 (radianer).
â Ett snitt i riktning d Ă€r detsamma som ett snitt i riktning pi*k+d för varje heltal k.
â Du kan returnera vilka riktningar som helst, de behöver inte vara inom [0,pi).
â Bedömaren kommer att berĂ€kna areorna av dina sex tĂ„rtstycken i doubles. Svaret kommer att accepteras om den relativa eller absoluta skillnaden mellan dem Ă€r mindre Ă€n 10^(-4).
â Mer precis, lĂ„t X och Y vara den minsta och den största av dina sex areor, berĂ€knade av bedömaren. DĂ„ kommer ditt svar att accepteras om Y < max(X + 10^(-4), X * (1+10^(-4))).
â (Den ursprungliga versionen av problemet anvĂ€nde 1e-7 precision istĂ€llet för 1e-4. För att lösa detta problem i arkivet sĂ€nktes precisionsgrĂ€nsen pĂ„ grund av existensen av utmaningsfall som troligen gör uppgiften olösbar med 1e-7 precision. I en ideal vĂ€rld skulle begrĂ€nsningarna inte tillĂ„ta sĂ„dana fall och fortfarande krĂ€va hög precision, sĂ„ att det inte Ă€r lĂ€tt att lösa problemet via nĂ„gon generell numerisk optimering.)
BegrÀnsningar
â x kommer att ha mellan 3 och 50 element, inklusive.
â y kommer att ha samma antal element som x.
â Alla koordinater kommer att vara mellan 0 och 10 000, inklusive.
â x och y kommer att beskriva en konvex polygon i moturs riktning.
Exempel
0)
{0, 20, 30, 50, 30, 20}
{10, 0, 0, 10, 20, 20}
Ă
tervÀnder:
{24.999999999437453, 9.999999999500002, 0.0, 0.7266423406817211, 2.4149503129080787 }
Symmetrisk, men inte regelbunden sexhörning. Ett exempel pÄ svaret motsvarar att skÀra den i tvÄ delar horisontellt och göra tvÄ andra snitt pÄ mitten som delar varje del i tre delar.

1)
{0, 1000, 0}
{0, 0, 1000}
Ă
tervÀnder:
{333.3333333331763, 333.3333333332546, 0.7853981633986264, 2.0344439357948154, 2.6779450445891753 }
RÀtvinklig triangel. à terigen kan vi börja med ett av de tre snitten lÀngs symmetriaxeln.

2)
{40, 70, 90, 90, 50}
{30, 20, 40, 100, 60}
Ă
tervÀnder:
{69.79517771922892, 52.77575974637605, 2.0616329654335885, 3.637826104091601, 4.32123485812475 }
Oregelbunden femhörning.

3)
{300, 400, 300, 200}
{500, 600, 700, 600}
Ă
tervÀnder: {299.99999999974995, 599.9999999995, 0.0, 1.107148717794088, 2.034443935795705}
Kvadrat, vriden 45 grader.

[]
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
Jag löste uppgiften pÄ
mindre Àn 10 minuter
10-30 minuter
30-60 minuter
1-2 timmar
mer Àn 2 timmar
annat
42 anvÀndare röstade. 47 anvÀndare avstod.
KĂ€lla: habr.com
