TĂąche de TopCoder Open 2019 : couper le gĂąteau en six parts

TĂąche de TopCoder Open 2019 : couper le gĂąteau en six parts
Sur la trace «Nos vainqueurs : TopCoder Open 2019» je publie des problÚmes du parcours Algorithm (programmation compétitive classique. Vous devez résoudre trois problÚmes en une heure et demie en Java, C#, C++ ou Python.)

1. GĂąteau pour six

Définition du problÚme

Limite de temps — 4 secondes.

Vous avez un gùteau. Si vous regardez par le dessus, le gùteau a la forme d'un polygone (strictement) convexe. On vous donne les coordonnées des sommets sous forme d'entiers X et Y.

Vous avez cinq amis. Vous souhaitez partager le gĂąteau en six parts Ă©gales (mais pas nĂ©cessairement de la mĂȘme forme). Bien sĂ»r, n'importe qui peut le faire en cinq coupes, mais seul un pro peut le faire en trois coupes.

Trouvez trois coupes en lignes passant par un point commun qui partageront le gĂąteau en six parts Ă©gales en surface. Affichez {x, y, d1, d2, d3}, oĂč (x, y) est le point commun de toutes les trois coupes, et d1, d2, d3 sont les angles de direction des coupes en radians.

DéfinitionClasse : CakeForSix
Méthode : cut
ParamĂštres : int[], int[]
Retourne : double[]
Signature de la méthode : double[] cut(int[] x, int[] y)
(assurez-vous que votre méthode est publique)

Notes

  • La direction positive le long de l'axe des x est Ă©gale Ă  0 (radian), la direction positive le long de l'axe des y est Ă©gale Ă  pi/2 (radian).
  • Une coupe dans la direction d est semblable Ă  une coupe dans la direction pi*k+d pour tout entier k.
  • Vous pouvez afficher n'importe quelle direction, elles ne doivent pas nĂ©cessairement ĂȘtre dans [0, pi).
  • Le grader calculera les surfaces de vos six morceaux de gĂąteau en doubles. La rĂ©ponse sera acceptĂ©e si la diffĂ©rence relative ou absolue entre elles est infĂ©rieure Ă  10^(-4).
  • Plus prĂ©cisĂ©ment, soit X et Y les plus petites et les plus grandes de vos six surfaces calculĂ©es par le grader. Votre rĂ©ponse sera acceptĂ©e si Y < max(X+10^(-4), X*1+10^(-4))).
  • (Dans la version originale du problĂšme, une prĂ©cision de 1e-7 Ă©tait utilisĂ©e au lieu de 1e-4. Pour rĂ©soudre ce problĂšme, la limite de prĂ©cision a Ă©tĂ© abaissĂ©e dans les archives Ă  cause de cas d'appels qui rendent probablement le problĂšme insoluble avec une prĂ©cision de 1e-7. Dans un monde idĂ©al, les contraintes ne permettraient pas de tels cas et exigeraient encore une haute prĂ©cision, donc rĂ©soudre le problĂšme par une optimisation numĂ©rique commune n'est pas simple.)

Restrictions

  • x contient entre 3 et 50 Ă©lĂ©ments inclus.
  • y contient le mĂȘme nombre d'Ă©lĂ©ments que x.
  • toutes les coordonnĂ©es entre 0 et 10 000 inclus.
  • x et y dĂ©finissent un polygone convexe dans le sens antihoraire.

Original en anglais

ÉnoncĂ© du problĂšme

La limite de temps est de 4 secondes.

Vous avez un gùteau. Vu d'en haut, le gùteau est un polygone (strictement) convexe. Vous avez les coordonnées de ses sommets dans les tableaux int[] x et y.

Vous avez cinq amis. Vous souhaitez maintenant couper le gĂąteau en six morceaux de mĂȘme aire (mais pas nĂ©cessairement de mĂȘme forme). Bien sĂ»r, quelqu'un peut le faire en cinq coupes — mais seul un vrai pro peut le faire en trois !

Trouvez trois coupes rectilignes passant par le mĂȘme point qui divisent le gĂąteau en six parts de mĂȘme taille. Retournez {x, y, d1, d2, d3}, oĂč (x, y) est le point commun des trois coupes, et d1, d2, d3 sont leurs directions en radians.

Définition

Classe : CakeForSix
Méthode : cut
ParamĂštres : int[], int[]
Retourne : double[]
Signature de la méthode : double[] cut(int[] x, int[] y)
(assurez-vous que votre méthode est publique)

Remarques
— La direction positive le long de l'axe des x est 0 (radians), la direction positive le long de l'axe des y est pi/2 (radians).
— Une coupe dans la direction d est Ă©quivalente Ă  une coupe dans la direction pi*k+d pour tout entier k.
— Vous pouvez retourner n'importe quelle direction, elles n'ont pas besoin d'ĂȘtre dans [0,pi).
— Le correcteur calculera les aires de vos six morceaux de gĂąteau en nombres dĂ©cimaux. La rĂ©ponse sera acceptĂ©e si la diffĂ©rence relative ou absolue entre elles est infĂ©rieure Ă  10^(-4).
— Plus prĂ©cisĂ©ment, soit X et Y les plus petites et plus grandes de vos six aires, comme calculĂ© par le correcteur. Votre rĂ©ponse sera acceptĂ©e si Y < max(X + 10^(-4), X * (1+10^(-4))).
— (La version originale du problĂšme utilisait une prĂ©cision de 1e-7 au lieu de 1e-4. Pour rĂ©soudre ce problĂšme dans l'archive, la limite de prĂ©cision a Ă©tĂ© abaissĂ©e en raison de l'existence de cas difficiles qui rendent probablement la tĂąche insolvable avec une prĂ©cision de 1e-7. Dans un monde idĂ©al, les contraintes ne permettraient pas de tels cas tout en nĂ©cessitant une haute prĂ©cision, de sorte qu'il n'est pas facile de rĂ©soudre le problĂšme par une optimisation numĂ©rique gĂ©nĂ©rale.)

Contraintes
— x contiendra entre 3 et 50 Ă©lĂ©ments inclus.
— y aura le mĂȘme nombre d'Ă©lĂ©ments que x.
— Toutes les coordonnĂ©es seront comprises entre 0 et 10 000 inclus.
— x et y dĂ©criront un polygone convexe dans le sens antihoraire.

Exemples

0)

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

Un hexagone symétrique mais irrégulier. Un exemple de réponse correspond à la coupe en deux parties horizontalement et à la réalisation de deux autres coupes au centre, qui divisent chaque section en trois parties.

TĂąche de TopCoder Open 2019 : couper le gĂąteau en six parts

1)

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

Un triangle rectangle. Encore une fois, nous pouvons commencer par l'une des trois coupes le long de l'axe de symétrie.

TĂąche de TopCoder Open 2019 : couper le gĂąteau en six parts

2)

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

Un pentagone irrégulier.

TĂąche de TopCoder Open 2019 : couper le gĂąteau en six parts

3)

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

Un carré, tourné de 45 degrés.

TĂąche de TopCoder Open 2019 : couper le gĂąteau en six parts

[Source]

Seuls les utilisateurs enregistrés peuvent participer au sondage. Connectez-vous, s'il vous plaßt.

J'ai résolu le problÚme en

  • moins de 10 minutes

  • 10-30 minutes

  • 30-60 minutes

  • 1-2 heures

  • plus de 2 heures

  • autre

42 utilisateurs ont voté. 47 utilisateurs se sont abstenus.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster