ccf备赛
Java算法:正态分布查表问题
在这篇文章中,我将分享一个我解决正态分布查表问题的过程。这个过程中,我遇到了输入输出、本地测试和线上提交的种种挑战,并最终找到了完美的解决方案。
- 初版代码(标准输入)
这是我最开始编写的,用于从标准输入(键盘)读取数据的代码。
package java001;
import java.util.Scanner;
public class ccf {
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
for(int i=0;i<k;i++){
int m = scanner.nextInt();
int s = scanner.nextInt();
int n = scanner.nextInt();
int ms = (n-m)*100 / s;
int r = (ms/10)+1;
int c = (ms%10)+1;
System.out.println(r+" "+c);
}
scanner.close();
}
}
2. 本地测试版本(文件输入)
在本地测试时,手动输入多组数据非常麻烦。为了解决这个问题,我修改了代码,使其能够从文件中读取输入。这需要导入 java.io 包来处理文件操作。
注意: 我在这里将类名改为了 MainTest,以避免与线上提交的 Main 类冲突。
Java
package java001;
import java.util.*;
import java.io.*;
public class ccf {
public void run(String filename) throws FileNotFoundException {
File file = new File(filename);
Scanner sc = new Scanner(file);
int k = sc.nextInt();
for (int i = 0; i < k; i++) {
int mu = sc.nextInt();
int sigma = sc.nextInt();
int n = sc.nextInt();
int mScaled = (n - mu) * 100 / sigma;
int r = (mScaled / 10) + 1;
int c = (mScaled % 10) + 1;
System.out.println(r + " " + c);
}
sc.close();
}
public static void main(String[] args) throws FileNotFoundException {
new ccf().run("eg1.txt");
}
}
3. 最终提交版本(线上评测)
在最终提交给评测系统时,需要遵循严格的命名规范和代码结构。我发现如果类是 public 的,那么文件必须与其同名。有些平台甚至要求类不能是 public 的。
我选择了一个最安全的写法,去掉了 public 关键字,确保代码在大多数评测系统上都能顺利编译和运行。同时,我也修复了之前代码中整数除法可能导致的精度问题,使用了 Math.round() 进行四舍五入,确保结果的精确性。
Java
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
for (int i = 0; i < k; i++) {
int mu = scanner.nextInt();
int sigma = scanner.nextInt();
int n = scanner.nextInt();
double m = (double)(n - mu) / sigma;
int mScaled = (int)Math.round(m * 100);
int r = (mScaled / 10) + 1;
int c = (mScaled % 10) + 1;
System.out.println(r + " " + c);
}
scanner.close();
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 言和和和!
评论
