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[] cut(int[] x, int[] y)
(әдісіңіздің жалпыға қолжетімді екеніне көз жеткізіңіз)

Ескертулер

  • x осі бойынша оң бағыт 0 (радиан), y осі бойынша оң бағыт pi/2 (радиан) болады.
  • d бағытындағы кесінді кез келген k бүтін саны үшін pi*k+d бағытындағы кесіндіге ұқсас.
  • Кез келген бағытты шығаруға болады, олар [0, pi]-ден басталуы міндетті емес.
  • Бағалаушы сіздің алты торт тіліміңіздің ауданын екі еселеп есептейді. Егер олардың арасындағы салыстырмалы немесе абсолютті айырмашылық 10^(-4)-тен аз болса, жауап қабылданады.
  • Дәлірек айтқанда, X және Y бағалаушы есептеген алты ауданның ең кішісі және ең үлкені болсын. Сонда сіздің жауабыңыз Y болса, қабылданады.
  • (Есептің бастапқы нұсқасында 1e-4 орнына 1e-7 дәлдігі қолданылған. Бұл мәселені шешу үшін, 1e-7 дәлдігімен есепті шешу мүмкін емес ететін шақыру жағдайларының болуына байланысты мұрағатта дәлдік шегі төмендетілді. Идеал әлемде шектеулер мұндай жағдайларды болдырмайды және әлі де жоғары дәлдікті талап етеді, сондықтан есепті жалпы сандық оңтайландыру арқылы шешу оңай емес.)

Шектеулер

  • x құрамында 3-тен 50-ге дейін элемент бар.
  • y элементінің саны x элементімен бірдей.
  • 0 мен 10 000 аралығындағы барлық координаттар қоса алғанда
  • x және y сағат тіліне қарсы бағытта дөңес көпбұрышты анықтайды.

Түпнұсқа ағылшын тілінде

Проблемалық мәлімдеме

Уақыт шегі - 4 секунд.

Сізде торт бар. Жоғарыдан қарағанда, торт (қатаң түрде) дөңес көпбұрыш. Сізге оның төбелерінің координаттары int[]sx және y айнымалыларында берілген.

Сіздің бес досыңыз бар. Енді сіз тортты тең ауданды алты бөлікке кескіңіз келеді (бірақ міндетті түрде бірдей пішінді емес). Әрине, мұны кез келген адам бес бөлікте жасай алады - бірақ оны тек нағыз маман ғана үш бөлікте жасай алады!

Тортты алты бірдей үлкен бөлікке бөлетін бір нүкте арқылы өтетін үш түзу сызықты кесіндіні табыңыз. {x, y, d1, d2, d3} қайтарыңыз, мұндағы (x, y) үш кесіндінің ортақ нүктесі, ал d1, d2, d3 олардың радианмен берілген бағыттары.

анықтама

Класс: CakeForSix
Әдіс: кесу
Параметрлер: int[], int[]
Қайтару: қос[]
Әдіс қолтаңбасы: double[] cut(int[] x, int[] y)
(әдісіңіздің жалпыға қолжетімді екеніне көз жеткізіңіз)

Ескертулер
— x осі бойымен оң бағыт 0 (радиан), y осі бойымен оң бағыт pi/2 (радиан).
— Кез келген k бүтін саны үшін d бағытындағы кесінді pi*k+d бағытындағы кесіндімен бірдей.
— Сіз кез келген бағытты қайтара аласыз, олардың [0,pi]-ден болуы міндетті емес.
— Бағалаушы сіздің алты торт кесегіңіздің ауданын екі еселеп есептейді. Егер олардың арасындағы салыстырмалы немесе абсолютті айырмашылық 10^(-4)-тен аз болса, жауап қабылданады.
— Дәлірек айтқанда, бағалаушы есептеген алты ауданның ішіндегі ең кішісі және ең үлкені X және Y болсын. Сонда сіздің жауабыңыз Y < max( X + 10^(-4), X * (1+10^(-4)) ) болған жағдайда қабылданады.
— (Есептің бастапқы нұсқасында 1e-4 орнына 1e-7 дәлдігі қолданылған. Мұрағаттағы бұл есепті шешу үшін дәлдік шегі тапсырманы 1e-7 дәлдігімен шешу мүмкін емес ететін қиын жағдайлардың болуына байланысты төмендетілді. Идеал әлемде шектеулер мұндай жағдайларға жол бермейді және әлі де жоғары дәлдікті қажет етеді, сондықтан есепті жалпы сандық оңтайландыру арқылы шешу оңай емес.)

Шектеу
— x құрамында 3-тен 50-ге дейін элементтер болады, соның ішінде.
— y элементінің саны x элементімен бірдей болады.
— Барлық координаттар 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

DDoS қорғауы бар сайттар үшін сенімді хостинг, VPS VDS серверлерін сатып алыңыз 🔥 DDoS қорғанысы, VPS VDS серверлері бар сенімді веб-сайт хостингін сатып алыңыз | ProHoster