我的代码在codechef中给出了错误的答案

时间:2018-06-03 12:26:06

标签: java error-handling compiler-errors

我的代码在我的编译器中工作正常,我甚至尝试了另外几个在线编译器,但仍然无法找到问题,有人可以帮忙!

问题

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

有一天,经过紧张的一天,厨师决定放松并参观他家附近的赌场赌博。他感到很幸运,他几乎把所有的钱都押了。

游戏厨师将在赌场玩,包括与N折腾  面对两次。在模具的每个面上都写有一个数字(这些数字不一定是不同的)。为了获胜,厨师必须获得数字A.  在第一次折腾和数字B  在第二次掷骰子上。

兴奋的观众希望知道Chef将赢得比赛的可能性。你能帮他们找到那个号码吗?假设Chef在每次投掷时以相同的概率获得骰子的每个面,并且投掷是相互独立的。

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 :(得分:3)

首先,你应该使用double而不是float(精度很重要)!

其次,您应该更新您的状态条件,因为您只考虑第一个子任务(T小于10,N小于100),这将只给你20分!第二个子任务(奖励80分)的T值小于70,N小于1000.

最后,代码的问题来自于更新pa&amp; amp; 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

答案 1 :(得分:2)

  1. 从不使用==!=比较浮点数。数字计算机不能以绝对精度表示浮点数,因此这些测试通常会失败。
  2. 从不float有效时使用double。使用浮点数会减少很多精度。
  3. 将整数输入保留为int s,仅在需要时转换为double,此处在进行概率计算时转换为double
  4. 不要像过去那样使代码过于复杂,并使用可测试的方法来帮助简化。例如,不需要使用数组。上面提到的限制可能不需要在你的程序中进行测试,而是假设是真的。
  5. 使用符合Java命名标准的变量名称,这是有意义的。
  6. 例如:

    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

答案 2 :(得分:0)

假设存在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

浮动的使用可能会导致结果与预期结果之间的细微差别。把它改成双倍。