望麓自卑—湖南大学最具潜力的校园传媒

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4411|回复: 4

【ACM入门贴一】在线判决系统的一些问题,和处理输入输出

[复制链接]
发表于 2007-9-4 23:14:00 | 显示全部楼层 |阅读模式
在线判决系统是机器判题系统,也就是俗称的OJ(Online Judge),机器判决的一个特点就是必须100%的吻合才能判为正确,否则要么WA,PE。同时对于提交的程序还有一定的时间限制,如果超过时间则会判超时。OJ一般采用的是标准输入输出,所以提交的时候我们不必要使用文件读入输出(这与高中的信息学是不同的),机器判决只针对程序结果,不针对程序,所以很多时候直接提交数据也是可以的,俗称打表。
  下面介绍常用的处理输入的方法(复制自HOJ discuss)

几种常用的处理输入方法(C语言) xnby 2007-04-30 12:39:56.0
感觉新人对于处理输入输出存在一些问题,这里写出几个常用到的处理方法:
1.知道输入数据组数n
scanf(\"%d\",&n);
whlie(n--){
   这里处理每一组输入.然后直接按格式输出,没必要开数组存储答案.
}
2.没有数据总数,以EOF结束
可能用的几个函数:
scanf():
while(scanf(\"%s|%d\")!=EOF){
   处理每一组数据,并输出.
}
getchar():读入一个字符
whlie((ch=getchar())!=EOF){
   
}
gets():读入一行
while(gets(buf)!=NULL) {
  
}
用getchar,gets注意读入读入换行符.
3.以0或-1结束的输入.
while(scanf(\"%d\",&n),n!=0) {
  
}

最后要说的是没看过FAQ的可以先看看FAQ.
补充一下C++的 relic 2007-05-02 21:54:39.0
cin读字符串时遇到空白符(空格,换行等)结束
char str[BUFFER];
while (cin >> str) {
}

getline读字符串时遇到换行符结束,用于读一整行
char str[BUFFER];
while (cin.getline(str, BUFFER)) {
}
string str;
while (getline(cin, str)) {
}

cin/cout要比scanf/printf慢一些,尽可能使用scanf/printf以避免测试大量数据时因为输入输出慢而导致TLE.

p.s. putchar/getchar要比scanf/printf更快
再补充一下java的 relic 2007-05-02 22:10:49.0
如果使用BufferedReader(jdk1.1或以后的版本,一次读一整行字符串,类似于gets)
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
String s;
while ((s = stdin.readLine()) != null) {
  可以用StringTokenizer st = new StringTokenizer(s);来按空格切词
  int n = Integer.parseInt(st.nextToken());
  double b = Double.parseDouble(st.nextToken());
}

如果使用Scanner(仅限于jdk1.5或以后的版本,一般用于从字符串中切词,类似于cin)
Scanner stdin = new Scanner(System.in);
while (stdin.hasNext()) {
  String s = stdin.next();
  int n = stdin.nextInt();
  double b = stdin.nextDouble();
}

至于输出,很多新手总会选择先将答案存储在一个数组里,等程序运行完再输出,其实这是没有必要的,机器判决是逐个字符匹配,所以完全可以处理一组输入后,便输出结果。
发表于 2007-9-4 23:34:38 | 显示全部楼层
阅完。我只用过JAVA。。。
JDK1。5以后版本的那个都没学 。
PS一个小问题:如何可以将字符串转换为表达式(指JAVA)。
 楼主| 发表于 2007-9-5 12:45:37 | 显示全部楼层
JAVA很久没用了,竞赛主要用的就是scanner,和buffer reader 吧
scanner 使用方便一些,不过题目有大量输入时会很慢,buffer reader
就要切词了(StringTokenizer),读入速度会快一些,不知你说的表达式指
什么.竞赛的主流语言是C/C++,Java只是起一些辅助作用吧,它的大数类
用起来方便
发表于 2007-12-31 18:49:35 | 显示全部楼层
顶上去
对新人很有用的
发表于 2008-1-12 10:10:17 | 显示全部楼层
Online Judge里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有Pascal/C/C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确。采用黑箱测试,系统里有一套标准的输入输出数据(对外保密,而且通常数据很多很怪),你的程序的输出和标准输出完全符合即可。常见的返回信息有AC(Accepted,通过)WA(Wrong Answer,输出有错误)TLE(Time Limit Exceeded,超时)MLE(Memory Limit Exceeded,内存溢出)RE(Runtime Error,发生实时错误)等,只有AC了才算做对一题。这里只是一个简要介绍,请大家在做题时先看看各网站上的FAQ,Enjoy it~~~

by Roba
http://bbs.pediy.com/showthread.php?p=92690&mode=threaded
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

每日推荐上一条 /1 下一条

小黑屋|手机版|湖南大学望麓自卑校园传媒 ( 湘ICP备14014987号 )

GMT+8, 2024-11-27 17:02 , Processed in 1.146206 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表