اذهب إلى المحتوى

السؤال

نشر

السلام عليكم 

عندي المشكلة التالية: https://open.kattis.com/problems/batteries

كانت الخوارزمية الأولى التي فكرت فيها هي Binary Search نظراً لأنها تعطي نتائج log n في الـ worst case ولكن تنفيذها أعطاني نتائج خاطئة ومختلفة عن المطلوب.

الفريب ان النتائج الي حصلت عليها كانت افضل من المتوقعة والمطلوبة 

لكن يبدو ان في نقطة بالسؤال غائبة عني

الخوارزمية الي كتبتها :

import java.util.Arrays;
import java.util.Scanner;

public class BatteriesTests {

    public static void main(String[] args) {

        BinarySearch ob = new BinarySearch();
        Scanner input = new Scanner(System.in);

        int cases = 0;

        //reading the inputs
        while(cases < 200) // allows at most 200 test cases
        {
            int mA = input.nextInt();
            if(mA==0)  // terminate the code when 0 is inserted
                break;

            int[] arr = new int[mA];

            for (int i = 1; i <= mA; i++) {
                arr[i-1] = i;
            }

            System.out.println(Arrays.toString(arr));

            ob.worstCaseNumTests(arr,mA);
            cases++;
        }
    }


    static class BinarySearch {

        void worstCaseNumTests(int arr[], int x) {

            int l = 0, r = arr.length - 1;
            int numOfTests = 0 ;

            while (l <= r) {
                int m = l + (r - l) / 2;

                // Check if x is present at mid
                if (arr[m] == x){
                    numOfTests++;
                    break;
                }

                // If x greater, ignore left half
                if (arr[m] < x){
                    l = m + 1;
                } else {  // If x is smaller, ignore right half/
                    r = m - 1;
                }
                numOfTests++;
            }

            System.out.println(numOfTests);
        }

    }
}

 

إذن سؤالي، هل الBinary Search هو الخوارزمية الصحيحة في هذه الحالة؟ إذا كان كذلك، وين اخطأت في الكود الخاص بي وكيف 23 أن تعطي 7؟ لأنني حاولت حساب BS يدويًا على 23 وأعطيتني 5 ، وليس 7.

 

مع تحياتي

Recommended Posts

  • 0
نشر

إن هذه المسألة تصنف مع مسائل Egg Dropping Puzzle | DP (مسألة إسقاط البيضة) حيث يكون لديك عدد من البيوض (عدد محاولات السقوط) و عدد الطوابق التي تختبر منها أعلى طابق يمكن للبيضة تحمل هذا السقوط.

أي غن حل المسألة هذه ليست بالبحث الثاني، بل البرمجة الديناميكية. أرجو تعلم هذه التقنية وإعادة محاولة حل المسألة.

شرح مبسط للمشكلة:

# k بيضة
# N طابق
# إرجاع أفضل نتيجة في هذه الحالة
def dp(K,N):
	res = 10000
	for i in range(1,N+1):
		res = min(res,رمي البيض على الطابق الأول هذه المرة)
	return res

ولكل رمي، إما أن تنكسر البيضة أو تبقى سليمة:

res = min(res,max(dp(K-1,i-1),# كسر عدد البيض -1
		dp(K,N-i)# لم ينكسر
		) + 1
		)

 

في هذه الحالة يتم حساب جميع الإحتمالات اللممكنة لكل طابق، ثم يكون الجواب بالقيمة الأقل لعدد المحاولات.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...