有时我在'codeforces.org'上解决问题,每次解决后我都会看到其他人的解决方案。但是大多数其他的解决方案包含了太多的代码。例如:我为多米诺堆积问题编写了如下代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int m = in.nextInt(), n = in.nextInt();
int count = n*(m/2);
if(m%2 == 1)
count += n/2;
System.out.println(count);
in.close();
}
}
但是在codeforces
中排名第二的petr
写出了这样的解
import java.io.*;
import java.util.*;
public class Template implements Runnable {
private void solve() throws IOException {
int n = nextInt();
int m = nextInt();
writer.println(n * m / 2);
}
public static void main(String[] args) {
new Template().run();
}
BufferedReader reader;
StringTokenizer tokenizer;
PrintWriter writer;
public void run() {
try {
reader = new BufferedReader(new InputStreamReader(System.in));
tokenizer = null;
writer = new PrintWriter(System.out);
solve();
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
int nextInt() throws IOException {
return Integer.parseInt(nextToken());
}
long nextLong() throws IOException {
return Long.parseLong(nextToken());
}
double nextDouble() throws IOException {
return Double.parseDouble(nextToken());
}
String nextToken() throws IOException {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
}
在这里,我们看到他使用线程和他自己定制的输入/输出技术。但我不明白他为什么这样解决这个问题,还有什么需要自己定制的i/o技术?让我印象最深刻的是,除了他的代码长,他的代码执行时间比我好。他的代码执行时间只有'90毫秒',而我的是'248毫秒'。
谁能给我解释一下背后的原因?许多编码员实际上都有预定义的竞赛模板。在codeforce上,通常,他们只是在读取他们想要编码的问题之前将模板复制到一个文件中,然后再编码到那个文件中。
这段代码实际上是Java的快速输入。一些关于代码强制的问题需要这样做。彼得一定只是复制了他常用的模板,并在那里编码了这个问题,即使这是不必要的。peter专门为这个问题编写的实际代码是名为Solve
的3行函数。
我在一本书上看到了这句话,这本书的名字叫";作者说这个代码比scanf快5~10倍。
由于我不懂java,我无法解释这段代码的含义,但我相信你能理解它。
/** Class for buffered reading int and double values */
class Reader {
static BufferedReader reader;
static StringTokenizer tokenizer;
/** call this method to initialize reader for InputStream */
static void init(InputStream input) {
reader = new BufferedReader(
new InputStreamReader(input) );
tokenizer = new StringTokenizer("");
}
/** get next word */
static String next() throws IOException {
while ( ! tokenizer.hasMoreTokens() ) {
//TODO add check for eof if necessary
tokenizer = new StringTokenizer(
reader.readLine() );
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt( next() );
}
static double nextDouble() throws IOException {
return Double.parseDouble( next() );
}
}