تحدي TopCoder Open 2019: قطع الفطيرة إلى ست قطع

تحدي TopCoder Open 2019: قطع الفطيرة إلى ست قطع
على خطى "لقد فزنا: بطولة TopCoder المفتوحة 2019" أنشر المشاكل من مسار الخوارزمية (برمجة رياضية كلاسيكية. في ساعة ونصف تحتاج إلى حل ثلاث مشكلات في Java أو C# أو C++ أو Python.)

1. فطيرة لستة أشخاص

صياغة المشكلة

الحد الزمني هو 4 ثواني.

لديك فطيرة. عندما ينظر إليها من الأعلى، فإن الكعكة لها شكل مضلع محدب (بشكل صارم). يتم إعطاؤك إحداثيات القمم في الأعداد الصحيحة X وY.

لديك خمسة أصدقاء. تريد تقسيم الفطيرة إلى ست قطع متساوية المساحة (ولكن ليس بالضرورة نفس الشكل). بالطبع، يمكن لأي شخص القيام بذلك في خمس قطع، ولكن فقط المحترف يمكنه القيام بذلك في ثلاث قطع.

ابحث عن ثلاث قطع في خطوط مستقيمة عبر نقطة واحدة تقسم الفطيرة إلى ستة أجزاء متساوية. اطبع {x، y، d1، d2، d3}، حيث (x، y) هي النقطة المشتركة لجميع القطع الثلاثة، وd1، d2، d3 هي زوايا اتجاه القطع بالراديان.

تعريفالفئة: كيك فور سيكس
الطريقة : قطع
المعلمات: int[]، int[] الإرجاع: double[] توقيع الطريقة: double[] Cut(int[] x, int[] y)
(تأكد من أن طريقتك عامة)

الملاحظات

  • الاتجاه الموجب على طول المحور x هو 0 (راديان)، والاتجاه الموجب على طول المحور y هو pi/2 (راديان).
  • القطع في الاتجاه d يشبه القطع في الاتجاه pi*k+d لأي عدد صحيح k.
  • يمكنك إخراج أي اتجاهات، وليس من الضروري أن تكون من [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 هي اتجاهاتها بالراديان.

تعريف

الفئة: كيك فور سيكس
الطريقة : قطع
المعلمات: int[]، int[] الإرجاع: double[] توقيع الطريقة: double[] Cut(int[] x, int[] y)
(تأكد من أن طريقتك عامة)

ملاحظة
- الاتجاه الموجب على طول المحور x هو 0 (راديان)، والاتجاه الموجب على طول المحور y هو pi/2 (راديان).
— القطع في الاتجاه d هو نفس القطع في الاتجاه pi*k+d لأي عدد صحيح k.
- يمكنك إرجاع أي اتجاهات، ليس من الضروري أن تكون من [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 سيكون له نفس عدد العناصر مثل 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 ساعة

  • في أكثر من ساعتين

  • آخر

صوّت 42 مستخدمًا. امتنع 47 مستخدما عن التصويت.

المصدر: www.habr.com

إضافة تعليق