当前位置:   article > 正文

算法比赛注意事项_算法比赛不同语言相同的时间限制

算法比赛不同语言相同的时间限制

1 ACM中java快速输入输出 

大家都知道,在ACM竞赛中,对程序运行时间有非常严格的要求,所以大部分人喜欢用C/C++,因为C/C++比JAVA快,JAVA容易超时。然而JAVA语言本身也有很多C/C++所没有的优势,为了让我们可爱的JAVA不因为运行时间而被ACMers吐槽,也为了让JAVA在ACM竞赛中发挥它更大的价值,故总结出JAVA高速IO输入输出,下面模板已经过多次测试,各大在线测评网站都支持使用。java的Scanner 比较慢(出了名的了),如果需要输入 105 数量级的数据并输出同样数量级的数据,使用Scanner和System.out耗时将很可能超过1s

1.1 使用 StreamTokenizer 和 PrintWriter

  1. StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  2. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

判断文件结尾: 

相当于Java的 while(scanner.hasNext()),或者C的 while(scanf("%d",&n)!=EOF), StreamTokenizer 类中判断文件结尾使用 while (in.nextToken() != StreamTokenizer.TT_EOF) ,StreamTokenizer.TT_EOF这个是个参数,就是相当于EOF了。

1.2 使用 BufferedReader (推荐上面那种)

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  1. /**
  2. * 为了从流中获取标记,可以调用StreamTokenizer的nextToken()方法。
  3. * 调用nextToken()方法以后
  4. * 如果标记是字符串,可用 String s=st.sval
  5. * 如果是整数用 int n=(int) st.nval
  6. * 如果是浮点数用 int n=st.nval //st.navl默认解析出的格式是double
  7. * StreamTokenizer.TT_EOF这是个参数,就是指文件尾,EOF
  8. */
  9. /* 下面这是IO流包装,可以看不懂,直接套用就好*/
  10. StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  11. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  12. in.nextToken();//第一个次读取前记得调用 in.nextToken()读下一个标记 nextToken()方法相当于让光标指向下一个位置,记得写
  13. int a = (int) in.nval;/*获取整数*/
  14. out.print(a);
  15. out.flush();//这里如果不刷新,不会输出结果 刷新缓冲区,否则a会留在缓冲区
  16. in.nextToken();
  17. double b = in.nval;//st.navl默认解析出的格式是double
  18. out.print(b);
  19. out.flush();
  20. in.nextToken();
  21. String str = in.sval; /*注意:sval是获取不带空格的字符串,含有空格的字符串貌似无法读取。*/
  22. out.print(str);/*输出语句*/
  23. out.flush();/*刷新输出缓冲区*/
  1. // 用于输入的对象
  2. StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  3. // 用于输出的对象
  4. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  5. // 必须先调用这个把下一个数据拉进来
  6. in.nextToken();
  7. int n = (int) in.nval; // 然后调用in.nval即可得到拉进来的数据
  8. //如果不知道还有没有下一个数据,可以这么写
  9. while (in.nextToken() != StreamTokenizer.TT_EOF) {
  10. // 然后在这里重复上述的输入过程,并干一些别的事情
  11. }
  12. //输出
  13. out.println(n);
  14. out.printf("%d ", n);
  15. //不管用上述的哪一种输出,最后记得flush
  16. out.flush();

 参考:https://www.cnblogs.com/likailiche/p/4462062.html


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/728734
推荐阅读
相关标签
  

闽ICP备14008679号