[关闭]
@Chobi15 2016-11-21T21:47:10.000000Z 字数 3197 阅读 9816

ACM新手上路帮助文档

未分类


写在前面:认真仔细读题! 认真仔细读题! 认真仔细读题!

第一部分:一些题目描述中需要注意的细节

(看第二部分之前先通读第一部分或许会解决很多疑问)

下面列的细节是新生很容易出错的地方,读完这些如果还不能解决你的问题请在群体提出或私聊管理员。

0,输入输出:

每一道题目都会有Input,Output这两个部分,这两个部分告诉你题目会以怎样的格式给你数据,然后你需要按照什么格式输出答案,然后Sample Input,Sample Output会给你一些测试数据帮你理解题目。
交一个题目的前提条件至少是你的程序能够正常编译运行,并且向程序输入样例输入时,结果和样例输出一模一样
不要额外输入或输出无关信息!!
以这道A+B题目为例
Input:
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.

Output:
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.

Sample Input:
1 5
10 20

Sample Output:
6
30

  1. //错误代码示范:
  2. //错误代码示范:
  3. //错误代码示范:
  4. ... 其余代码
  5. printf("请输入两个整数");//错误原因:我们必须按照题目的格式来输入输出,不能额外输出任何东西,这句话得删掉
  6. scanf("%d,%d", &a, &b);//错误原因:大多数题目的数据是用空格分隔两个数,这样读入会错 直接scanf("%d%d");即可
  7. ... 其余代码
  8. printf("ans = %d\n", ans);//错误原因:题目要求只要求输出两个数的答案数值,"ans = "是额外信息,提交上去会错。应该这样printf("%d\n",ans);
  9. //如果还有疑问,没关系,继续向下阅读。
  10. ... 其余代码

1,“多组数据/multiple test cases”:

有些题目描述可能会包含上面这一句话,或者类似的语句。这些题目数据组数不止一组,意思就是你需要同时对于多组数据进行计算得到答案。具体细节后面会讲到。

2,“一行/a line”:

无论输入还是输出描述都可能会看到这个词。比如“每一行答案占一行”,这个时候假设答案是ans,那么我们输出答案的时候就得这样:printf("%d\n",ans);,再比如如果让你输出两个答案,并且之间空一行,你就得printf("%d\n\n%d\n", ans1, ans2);,以此类推。

3,scanf:

scanf读入数值或字符串的时候会忽略输入中的(Tab,回车,空格),所以读入两个以空格或者换行符分隔开的整数scanf("%d%d", &a, &b);这条语句都可以办到。
如果我们要读入三个用空格或者换行分开的字符a,b,c,推荐这样读入

  1. char s1[10], s2[10], s3[10];
  2. scanf("%s%s%s"s1, s2, s3);
  3. //这个时候 s1[0],s2[0],s3[0],就分别是字符a,b,c了,并不需要考虑他们用什么分隔,很方便

4, 判题方式:

我们的题目拿到OJ去判题你可以理解为输入输出是从文件读入,就相当于在main函数里面加入下面这两句语句。

  1. freopen("in", "r", stdin);
  2. freopen("out", "w", stdout);

可能你并不懂这两句话的意思,但只需要记住输入和输出是分开的,只要我输出的信息是按照题目格式就没有问题,这和什么时候输出答案没关系。比如现在要求你计算两组数a+b和c+d的答案两个答案每个答案占一行,那么下面两个代码都是等效并正确的

  1. //假设a=1,b=2,c=3,d=4。
  2. //下面是第一份代码
  3. int a, b, c, d;
  4. scanf("%d%d", &a, &b);
  5. printf("%d\n", a+b);//注意每个答案占一行,所以得\n
  6. scanf("%d%d", &c, &d);
  7. printf("%d\n", c+d);//注意每个答案占一行,所以得\n
  8. //下面是第二份代码
  9. int a, b, c, d;
  10. scanf("%d%d%d%d", &a, &b, &c, &d);
  11. printf("%d\n%d\n", a+b, c+d);//注意每个答案占一行,所以得\n
  12. //上面两份代码最后 在out文件里面都是下面的样子
  13. 3
  14. 7
  15. //以上是out文件的样子
  16. //以下是如果没有在每个答案后面打\n的out文件
  17. 37
  18. //以上是out文件的样子

OJ会比对你程序执行后的out文件和标准答案的out文件,out文件完全一致就会判定为答案正确。所以少打或多打一个换行符,空格符,以及其他任何字符都会显示答案错误

5,EOF:

EOF是end of file的简称,当我们用scanf函数从文件读入数据时,如果已经读到文件末尾之后没有信息了,那么scanf的返回值就是EOF(scanf也是一个函数,也有返回值,具体可以百度或看书),我们可以通过这个来判断题目数据是否已经读完,具体可看下面的题解,有详细例子。

6,我不服!!

或许大家会有这样的疑问,为什么我程序在我的电脑上运行正确,但是交到OJ上就显示错误,明明我的代码是“正确”的!!
每一道题目,他的输入数据不仅仅只有题目上的那些,还有很多很多数据,你需要考虑到每一种情况下你都能得到正确答案,这样你的代码才能得到一个Accept,加油!!

第二部分,基础题解题报告

不能直接复制代码提交题目,会错!!!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注