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)
(усулуңуз жалпыга ачык экенине ишениңиз)

жазуулар

  • х огу боюнча оң багыт 0 (радиан), у огу боюнча оң багыт pi/2 (радиан).
  • d багытындагы кесүү каалаган бүт k саны үчүн pi*k+d багытындагы кесүүгө окшош.
  • Сиз каалаган багыттарды чыгара аласыз, алар [0, pi) болушу шарт эмес.
  • Грейдер сиздин алты даана тортуңуздун аянтын эки эселеп эсептейт. Эгерде алардын ортосундагы салыштырмалуу же абсолюттук айырма 10^(-4) аз болсо, жооп кабыл алынат.
  • Тагыраак айтканда, X жана Y грейдер эсептеген алты аймактын эң кичинеси жана эң чоңу болсун. Анда сиздин жообуңуз кабыл алынат, эгерде Y
  • (Маселенин түпнуска версиясында 1e-7 эмес, 1e-4 тактыгы колдонулган. Архивдеги бул маселени чечүү үчүн маселени тактык менен чечүүгө мүмкүн болбой турган чалуу учурларынын болушуна байланыштуу тактык чеги төмөндөтүлгөн. 1e-7. Идеалдуу дүйнөдө чектер мындай учурларга жол бербейт жана дагы эле жогорку тактыкты талап кылат, андыктан маселени кандайдыр бир жалпы сандык оптималдаштыруу менен чечүү оңой эмес.)

чектөөлөр

  • x 3төн 50гө чейин элементтерди камтыйт.
  • у х менен бирдей сандагы элементтерди камтыйт.
  • 0 жана 10 000 ортосундагы бардык координаттар
  • 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)
(усулуңуз жалпыга ачык экенине ишениңиз)

жазуулар
— х огу боюнча оң багыт 0 (радиан), у огу боюнча оң багыт 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 XNUMX арасында болот.
— x жана y томпок көп бурчтукту саат жебесине каршы тартипте сүрөттөйт.

мисалдар

0)

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

Симметриялуу, бирок туура эмес алты бурчтук. Мисал жообу аны горизонталдуу түрдө экиге бөлүп, ар бир бөлүктү үч бөлүккө бөлүүчү борборду эки башка кесип жасоого туура келет.

TopCoder Open 2019 чакырыгы: пирогту алты бөлүккө кесип

1)

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

Тик бурчтуу үч бурчтук. Дагы, биз симметрия огу боюнча үч кесип бири менен баштай алабыз.

TopCoder Open 2019 чакырыгы: пирогту алты бөлүккө кесип

2)

{40, 70, 90, 90, 50}
{30, 20, 40, 100, 60}
Returns:
{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 колдонуучу добуш берүүдөн баш тартты.

Source: www.habr.com

Комментарий кошуу