TopCoder Open 2019 сорилт: бялууг зургаан хэсэг болгон хайчилж ав

TopCoder Open 2019 сорилт: бялууг зургаан хэсэг болгон хайчилж ав
Зам дээр “Манайх яллаа: TopCoder Open 2019” Би алгоритмын замаас асуудлуудыг нийтэлдэг (Сонгодог спортын програмчлал. Нэг цаг хагасын дотор та Java, C#, C++ эсвэл Python хэл дээр гурван асуудлыг шийдэх хэрэгтэй.)

1. Зургаан хүний ​​бялуу

Асуудлын тодорхойлолт

Хугацаа нь 4 секунд байна.

Танд бялуу байна. Дээрээс нь харахад бялуу нь (хатуу) гүдгэр олон өнцөгт хэлбэртэй байдаг. X ба Y бүхэл тоонуудын оройнуудын координат танд өгөгдсөн.

Та таван найзтай. Та бялууг ижил хэмжээтэй зургаан хэсэг болгон хуваахыг хүсч байна (гэхдээ ижил хэлбэртэй байх албагүй). Мэдээжийн хэрэг, хэн ч үүнийг таван зүсэлтээр хийх боломжтой, гэхдээ зөвхөн мэргэжлийн хүн үүнийг гурван зүсэлтээр хийх боломжтой.

Бялууг зургаан тэнцүү хэсэгт хуваах нэг цэгээр дамжин шулуун шугамаар гурван зүсэлтийг ол. {x, y, d1, d2, d3} гэж хэвлэх ба энд (x, y) нь бүх гурван зүсэлтийн нийтлэг цэг, d1, d2, d3 нь радиан дахь зүсэлтийн чиглэлийн өнцөг юм.

тодорхойлолтАнги: CakeForSix
Арга: зүсэх
Параметрүүд: int[], int[] Буцах: double[] Аргын гарын үсэг: double[] cut(int[] x, int[] y)
(таны арга олон нийтэд нээлттэй байгаа эсэхийг шалгаарай)

Тэмдэглэл

  • X тэнхлэгийн дагуух эерэг чиглэл нь 0 (радиан), y тэнхлэгийн дагуух эерэг чиглэл нь pi/2 (радиан) байна.
  • d чиглэлийн зүсэлт нь k бүхэл тооны хувьд pi*k+d чиглэлийн зүсэлттэй төстэй.
  • Та дурын чиглэлийг гаргаж болно, тэдгээр нь [0, pi) -ээс байх албагүй.
  • Ангилагч таны зургаан ширхэг бялууны талбайг хоёр дахин тооцоолох болно. Харьцангуй буюу үнэмлэхүй зөрүү нь 10^(-4)-ээс бага байвал хариултыг хүлээн авна.
  • Нарийвчлан хэлэхэд, X ба Y-ийг ангилагчийн тооцоолсон зургаан талбайн хамгийн жижиг, хамгийн том нь гэж үзье. Хэрэв Y байвал таны хариултыг хүлээн авна
  • (Асуудлын анхны хувилбарт 1e-7-ийн оронд 1e-4 нарийвчлалыг ашигласан. Архив дахь энэ асуудлыг шийдэхийн тулд асуудлыг нарийвчлалтайгаар шийдвэрлэх боломжгүй дуудлага хийх тохиолдлууд байгаа тул нарийвчлалын хязгаарыг бууруулсан. 1e-7. Тохиромжтой ертөнцөд хязгаарлалт нь ийм тохиолдлыг зөвшөөрдөггүй бөгөөд өндөр нарийвчлал шаарддаг тул ерөнхий тоон оновчлолоор асуудлыг шийдэх нь тийм ч хялбар биш юм.)

Хязгаарлалтууд

  • x нь 3-аас 50 хүртэлх элементийг багтаасан.
  • y нь x-тэй ижил тооны элементүүдийг агуулна.
  • 0-ээс 10 хүртэлх бүх координатууд
  • x ба y нь цагийн зүүний эсрэг гүдгэр олон өнцөгтийг тодорхойлно.

англи хэл дээрх эх

Асуудлын мэдэгдэл

Хугацаа нь 4 секунд байна.

Танд бялуу байна. Дээрээс нь харахад бялуу нь (хатуу) гүдгэр олон өнцөгт юм. Танд түүний оройн координатыг int[]sx ба y хэсэгт өгнө.

Та таван найзтай. Та одоо бялууг ижил хэмжээтэй зургаан хэсэг болгон хуваахыг хүсч байна (гэхдээ ижил хэлбэртэй байх албагүй). Мэдээжийн хэрэг, хэн ч үүнийг таван зүсэлтээр хийж чадна, гэхдээ зөвхөн жинхэнэ мэргэжлийн хүн үүнийг гурав дахин хийж чадна!

Бялууг ижил хэмжээтэй зургаан хэсэг болгон хуваасан ижил цэгийг дайран өнгөрөх гурван шулуун шугамыг ол. Буцах {x, y, d1, d2, d3}, энд (x, y) нь гурван зүсэлтийн нийтлэг цэг, d1, d2, d3 нь тэдгээрийн радиан дахь чиглэл юм.

тодорхойлолт

Анги: CakeForSix
Арга: зүсэх
Параметрүүд: int[], int[] Буцах: double[] Аргын гарын үсэг: double[] cut(int[] x, int[] y)
(таны арга олон нийтэд нээлттэй байгаа эсэхийг шалгаарай)

тэмдэглэл
— x тэнхлэгийн дагуух эерэг чиглэл нь 0 (радиан), y тэнхлэгийн дагуух эерэг чиглэл нь pi/2 (радиан) байна.
— d чиглэлийн зүсэлт нь бүхэл k тоонуудын хувьд pi*k+d чиглэлийн зүсэлттэй ижил байна.
— Та дурын чиглэлийг буцаах боломжтой, тэдгээр нь [0,pi) байх албагүй.
- Ангилагч таны зургаан ширхэг бялууны талбайг хоёр дахин тооцоолох болно. Харьцангуй буюу үнэмлэхүй зөрүү нь 10^(-4)-ээс бага байвал хариултыг хүлээн авна.
- Нарийвчлан хэлэхэд, ангилагчийн тооцоолсноор X ба Y нь таны зургаан талбайн хамгийн жижиг, хамгийн том нь байг. Дараа нь Y < max( X + 10^(-4), X * (1+10^(-4)) ) байвал таны хариултыг хүлээн авна.
— (Бодлогын анхны хувилбарт 1e-7-ийн оронд 1e-4 нарийвчлалыг ашигласан. Архив дахь энэ асуудлыг шийдвэрлэхийн тулд 1e-7 нарийвчлалтайгаар даалгаврыг шийдвэрлэх боломжгүй сорилттой тохиолдлууд байгаа тул нарийвчлалын хязгаарыг бууруулсан. Тохиромжтой ертөнцөд хязгаарлалтууд нь ийм тохиолдлуудыг зөвшөөрдөггүй бөгөөд өндөр нарийвчлал шаарддаг тул зарим ерөнхий тоон оновчлолоор асуудлыг шийдэх нь тийм ч хялбар биш юм.)

Хязгаарлалт
- x нь 3-аас 50 хүртэлх элементтэй байна.
— y нь х-тэй ижил тооны элементтэй байна.
— Бүх координатууд нь 0-ээс 10,000-ын хооронд байх болно.
- x ба y нь гүдгэр олон өнцөгтийг цагийн зүүний эсрэг дарааллаар дүрслэх болно.

жишээ

0)

{0, 20, 30, 50, 30, 20}
{10, 0, 0, 10, 20, 20}
Буцаах:
{24.999999999437453, 9.999999999500002, 0.0, 0.7266423406817211, 2.4149503129080787 }

Тэгш хэмтэй боловч жигд бус зургаан өнцөгт. Жишээ хариулт нь хэвтээ байдлаар талыг нь огтолж, хэсэг бүрийг гурван хэсэгт хуваах төвийг доош хоёр өөр зүсэлт хийхтэй тохирч байна.

TopCoder Open 2019 сорилт: бялууг зургаан хэсэг болгон хайчилж ав

1)

{0, 1000, 0}
{0, 0, 1000}
Буцаах:
{333.3333333331763, 333.3333333332546, 0.7853981633986264, 2.0344439357948154, 2.6779450445891753 }

Зөв гурвалжин. Дахин хэлэхэд бид тэгш хэмийн тэнхлэгийн дагуух гурван зүсэлтийн аль нэгээр эхэлж болно.

TopCoder Open 2019 сорилт: бялууг зургаан хэсэг болгон хайчилж ав

2)

{40, 70, 90, 90, 50}
{30, 20, 40, 100, 60}
Буцаах:
{69.79517771922892, 52.77575974637605, 2.0616329654335885, 3.637826104091601, 4.32123485812475 }

Тогтмол бус таван өнцөгт.

TopCoder Open 2019 сорилт: бялууг зургаан хэсэг болгон хайчилж ав

3)

{300, 400, 300, 200}
{500, 600, 700, 600}
Буцаах: {299.99999999974995, 599.9999999995, 0.0, 1.107148717794088, 2.034443935795705 }

Квадрат 45 градус эргэлддэг.

TopCoder Open 2019 сорилт: бялууг зургаан хэсэг болгон хайчилж ав

[Эх сурвалж]

Зөвхөн бүртгэлтэй хэрэглэгчид санал асуулгад оролцох боломжтой. Нэвтрэх, гуйя.

Би асуудлыг шийдсэн

  • 10 минут хүрэхгүй хугацаанд

  • 10-30 минут

  • 30-60 минут

  • 1-2 цаг

  • 2 цагаас илүү хугацаанд

  • бусад

42 хэрэглэгч санал өгсөн. 47 хэрэглэгч түдгэлзсэн.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх