我的代码在我的编译器中工作正常,我甚至尝试了另外几个在线编译器,但仍然无法找到问题,有人可以帮忙!
问题
https://www.codechef.com/JUNE18B/problems/NAICHEF
有一天,经过紧张的一天,厨师决定放松并参观他家附近的赌场赌博。他感到很幸运,他几乎把所有的钱都押了。
游戏厨师将在赌场玩,包括与N折腾 面对两次。在模具的每个面上都写有一个数字(这些数字不一定是不同的)。为了获胜,厨师必须获得数字A. 在第一次折腾和数字B 在第二次掷骰子上。
兴奋的观众希望知道Chef将赢得比赛的可能性。你能帮他们找到那个号码吗?假设Chef在每次投掷时以相同的概率获得骰子的每个面,并且投掷是相互独立的。
我的提交
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));
}
}
}
}
答案 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);
}
}
}
答案 1 :(得分:2)
==
或!=
比较浮点数。数字计算机不能以绝对精度表示浮点数,因此这些测试通常会失败。float
有效时使用double
。使用浮点数会减少很多精度。int
s,仅在需要时转换为double
,此处在进行概率计算时转换为double
例如:
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;
}
}
答案 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
由于这恰好在您的代码中,因此您已经为计算实现了正确的算法,因此问题必须包含在算法之外的其他内容。
浮动的使用可能会导致结果与预期结果之间的细微差别。把它改成双倍。