为什么人们在竞争性编程中使用如此多的代码来编写解决方案



有时我在'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() );
    }
}

相关内容

  • 没有找到相关文章

最新更新