Мой код дает неправильный ответ в codechef - PullRequest
0 голосов
/ 03 июня 2018

Мой код прекрасно работает в моем компиляторе, и я даже попробовал еще несколько онлайн-компиляторов, но все еще не смог найти проблему, может кто-то помочь!

Вопрос

https://www.codechef.com/JUNE18B/problems/NAICHEF

Однажды, после напряженного дня, Шеф решил расслабиться и посетить казино возле своего дома, чтобы сыграть в азартные игры.Ему повезло, и он собирается поставить почти все свои деньги.

Игра, в которую Шеф собирается играть в казино, состоит в том, чтобы дважды бросить кубик с N лицами.На каждой лицевой стороне кубика написано число (эти цифры не обязательно различны).Чтобы победить, шеф-повар должен получить число A при первом броске и число B при втором броске кубика.

Взволнованные зрители хотят знать вероятность того, что шеф выиграет игру.Можете ли вы помочь им найти этот номер?Предположим, что шеф получает каждую грань кубика с одинаковой вероятностью при каждом броске, а броски взаимно независимы.

question1 question2

Мое представление

import static java.lang.System.exit;
import java.util.*;
import java.lang.*;

/**
 *
 * @author williamscott
 */
public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        boolean status = true;

        int T = Integer.parseInt(in.nextLine());

        //Original Constraint
        if (T < 1 || T > 10) {
//            System.out.println("Please follow original constraint for T");
//            exit(0);
            status = false;
        }

        int N[] = new int[T], A[] = new int[T], B[] = new int[T];
        float Probability[] = new float[T];

        for (int t = 0; t < T; t++) {

            String[] input = in.nextLine().split(" ");

            N[t] = Integer.parseInt(input[0]);
            A[t] = Integer.parseInt(input[1]);
            B[t] = Integer.parseInt(input[2]);

            if (N[t] < 1 || N[t] > 100) {
//                System.out.println("Please follow original constraint for N");
//                exit(0);
                status = false;
            }

            if (A[t] < 1 || A[t] > N[t]) {
//                System.out.println("Please follow original constraint for A");
//                exit(0);
                status = false;

            }

            if (B[t] < 1 || B[t] > N[t]) {
//                System.out.println("Please follow original constraint for B");
//                exit(0);
                status = false;
            }

            float pn, pa = 0, pb = 0;

            String[] f = in.nextLine().split(" ");
            pn = f.length;

            if (pn != N[t]) {
//                System.out.println("Inputs Invalid");
//                exit(0);
                status = false;
            }

            for (String f1 : f) {

                if (Integer.parseInt(f1) < 1 || Integer.parseInt(f1) > N[t]) {
//                    System.out.println("Please follow original constraint for x (input)");
//                    exit(0);
                    status = false;
                }

                if (Integer.parseInt(f1) == A[0]) {
                    pa++;
                }
                if (Integer.parseInt(f1) == B[0]) {
                    pb++;
                }
            }

            Probability[t] = (pa / pn) * (pb / pn);
        }

        if (status) {
            for (float d : Probability) {
                System.out.println(String.format("%.10f", d));
            }
        }

    }

}

Ошибка: Error Image

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Прежде всего, вы должны использовать double, а не float (точность имеет значение)!

Во-вторых, вы должны обновить свои условия для статуса, потому что вы принимаете во внимание только первую подзадачу с (T меньше, чем10, а N меньше 100), что даст вам только 20 баллов!вторая подзадача (которая приносит 80 баллов) занимает T меньше 70 и N меньше 1000.

Наконец, проблема с кодом связана с условием обновления pa & pb, которое вы используете:

    Integer.parseInt(f1) == A[0]  // same for B[0]

вместо

    Integer.parseInt(f1) == A[t]  // same for B[t]

Вот полный код и результаты отправки

    import java.util.*;
    import java.lang.*;

    /**
     *
     * @author aoubidar
     */
    public class Main {

        public static void main(String[] args) {

            Scanner in = new Scanner(System.in);

            // number of test cases
            int T = Integer.parseInt(in.nextLine());


            int[] N = new int[T];
            int[] A = new int[T];
            int[] B = new int[T];

            double[] Probability = new double[T];

            for (int t = 0; t < T; t++) {

                String[] input = in.nextLine().split(" ");

                N[t] = Integer.parseInt(input[0]);
                A[t] = Integer.parseInt(input[1]);
                B[t] = Integer.parseInt(input[2]);

                int total, pa = 0, pb = 0 ;

                String[] faces = in.nextLine().split(" ");
                total = faces.length;

                for (String f : faces) {

                    if (Integer.parseInt(f) == A[t]) {
                        pa++;
                    }
                    if (Integer.parseInt(f) == B[t]) {
                        pb++;
                    }
                }

                double pn = (double) (total * total);

                Probability[t] = (pa * pb) / pn ;
            }

            for (double d : Probability) {
                System.out.println(d);
            }


        }

    } 

успех отправки:
submission succes

0 голосов
/ 03 июня 2018

Предположим, что n (A) - это число вхождений A в кости, а n (B) - количество вхождений B в кости.При этом вероятность того, что A будет брошено в данный момент времени, равна

P (A) = n (A) / N

, а вероятность того, что B будетбыть брошенным в данное время:

P (B) = n (B) / N

Вероятность того, что A будет брошен первым, а B будет брошен вторым

P (A) ^ P (B) = P (A) * P (B)

, поскольку эксперименты независимы.

P (A) * P (B) = n (A) * n (B) / N ^ 2

, поскольку это именно в вашем коде, вы реализовали правильный алгоритм длявычисление, поэтому проблема должна заключаться в чем-то ином, чем алгоритм.

Использование float

Использование float может вызывать небольшие различия между вашим результатом и ожидаемым результатом.Измените его на удвоение.

0 голосов
/ 03 июня 2018
  1. Никогда сравнивать числа с плавающей запятой, используя == или !=.Цифровые компьютеры не могут представлять числа с плавающей запятой с абсолютной точностью, и поэтому эти тесты часто не пройдут.
  2. Никогда не используйте float, когда double будет работать.Вы получаете мало, используя float, и теряете большую точность.
  3. Оставьте свой целочисленный ввод как int с и конвертируйте в double только при необходимости, здесь приведите к double при выполнении вычисления вероятности
  4. Не усложняйте ваш код, как вы делаете, и используйте тестируемые методы, которые также помогут упростить его.Нет необходимости использовать массивы, например.Упомянутые выше ограничения, скорее всего, не нужно проверять в вашей программе, а скорее предполагается, что они истинны.
  5. Используйте имена переменных, которые соответствуют стандартам именования Java, и это имеет смысл.

Например:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // get number of trys
        String line = scanner.nextLine();
        int trys = Integer.parseInt(line.trim());
        for (int i = 0; i < trys; i++) {
            // for each try, calc probability
            double probability = processTry(scanner);
            System.out.println(probability);
        }
        scanner.close();
    }

    private static double processTry(Scanner scanner) {
        String line;
        // get first line
        line = scanner.nextLine();

        // use Scanner to get ints from line
        Scanner lineScan = new Scanner(line);

        //number of faces
        int numberOfFaces = lineScan.nextInt();
        int a = lineScan.nextInt();
        int b = lineScan.nextInt();
        lineScan.close();

        // scanner to get face values
        line = scanner.nextLine();
        lineScan = new Scanner(line);

        // count of how many faces match a and b values
        int aMatch = 0;
        int bMatch = 0;
        for (int i = 0; i < numberOfFaces; i++) {
            int face = lineScan.nextInt();
            if (a == face) {
                aMatch++;
            } 
            if (b == face) {
                bMatch++;
            }
        }
        lineScan.close();

        // only cast to double when need for calc
        double probability = ((double) (aMatch * bMatch) / (numberOfFaces * numberOfFaces));
        return probability;
    }
}

enter image description here

...