从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

[[TracNav(TOC)]]

= 题目组成 =

每道题目需要准备这些文件,放在以题号为名字的目录下,注意文件名是唯一的(*表示非必须,但一般要求有;**表示是可选的):

 * 描述文件(text):这应该是一个html格式的题目描述;
 * 输入文件(input):测试数据的输入部分,如果没有输入,则可以是一个空文件;
 * 输出文件(output):对应的测试数据的输出,在不是Special Judge(spj)的情况下,如果提交的程序输出和这个文件一模一样,就会得到Accepted(AC);
 * *标准程序(solution.cc):这应该是一个采用正确算法,并能AC的程序,虽然不用于Judge,但是通常都是必须提供作为参考的;
 * **特殊判断程序(checker.cc):我们知道有些问题是一题多解或允许精度误差的,那么前面直接和output文件比较的方法就不够了,所以需要spj,spj的题将由这个checker.cc中的程序来judge,规则在后面介绍。

同时,还应该有以下参数:

 * Code:题号,'''合法的题号长度不能超过8''',通常是1001, 1002...或者ABCD...,但往年集训从我的八卦开始,各队都有过七耀、七彩虹、七大元素、基本数据类型等系列题号;
 * Title:标题,描述文件(text)是不包含标题的,标题应该在这里定义,题目标题按照英文习惯,除了冠词和介词,都要首字母大写;[wiki:英文标题大小写规则]
 * Use Checker:是否spj,true or false,如果有,一定要有checker.cc;
 * TL(s):时间限制(Time Limit),通常是2s;
 * ML(KB):内存限制(Memory Limit),通常是65536kB;
 * OL(KB):输出限制(Output Limit),通常是16000kB,超过judge将返回OLE;
 * SL(KB):提交限制(Submit Limit),通常是32kB,超过这个大小的代码无法提交到OJ上;
 * *Author:题目作者,请使用统一的格式:"XING, Mingzi",比如"WU, Zejun";
 * **Source:题目来源,由于都是原创题,一般留空;
 * **Contest:比赛名称,一般会用Contest ${contest-id} By ${group-name},比如Contest 6 by CError,这个由组长统一搞定就好了;

以下说明主要针对格式,而没有对内容做太多说明,其它部分请参考[wiki:怎样出好题]。

= text =

== 模板 ==

{{{
#!html
<pre class="wiki">
&lt;p&gt;
第一段描诉
&lt;/p&gt;

&lt;p&gt;
第二~N段描诉
&lt;/p&gt;

&lt;h4&gt;Input&lt;/h4&gt;

&lt;p&gt;
输入说明
&lt;/p&gt;

&lt;h4&gt;Output&lt;/h4&gt;

&lt;p&gt;
输出说明
&lt;/p&gt;

&lt;h4&gt;Sample Input&lt;/h4&gt;

&lt;pre&gt;
输入样例
&lt;/pre&gt;

&lt;h4&gt;Sample Output&lt;/h4&gt;

&lt;pre&gt;
输出样例
&lt;/pre&gt;

&lt;h4&gt;Hint&lt;/h4&gt;

&lt;p&gt;
这部分非必需,可以在这里对Sample进行解释
&lt;/p&gt;
</pre>
}}}

== 基本格式 ==

前面说了,这个就是显示在ZOJ的showProblem.do页面主体部分的题目描述html,不过注意,没有<html>, <head>, <body>这些标签。'''严禁用所见即得的网页编辑工具'''来写这个文件,越是不熟悉html的人越是会产生冗余,不统一,甚至难看的html。'''请务必使用智能的编辑器''',至少要求两点:1、能高亮html的标签匹配;2、能检查<和>的转义。如果不熟悉html,希望下面的东西会对你有帮助,也可以上网搜一些教程。首先,我们可以先建一个名为text.html文件,用gvim来编辑它,再用firefox打开看其效果。

常用到的html标签有这些:
 * <h1></h1>, <h2></h2>到<h6></h6>,除了作为模板中的<h4>,不要用这些标签;
 * <p></p>表示段落(只有<p>,而没有对应的</p>是错误的!),换行使用<br>,具有较好的兼容性(<br/>是XHTML标准),只应该用在段内换行;
 * <strong></strong>表示黑体,通常用在Input和Output部分需要强调的地方,效果同<b>加粗;
 * <var></var>和<em></em>都是斜体,效果同<i>倾斜,英语中常用于<em>作品名称</em>,'''题目描述中所有的变量明要求用<var>斜体</var>''',比如"the first line contains <var>n</var>, <var>m</var> and <var>k</var>","the first line contains ''n'', ''m'' and ''k''" (变量名的斜体最好使用<var>标签,而其它诸如人名,书名,强调的斜体可以用<em>)
 * <sup></sup>是上标,<sub></sub>是下标,比如"a<sub>i</sub><sup>n</sup>", "a,,i,,^n^"
 * <pre></pre>保留格式,通常html里把多个连续的空格、tab和换行解释为一个空格,用pre则不会这样,而且默认情况下会使用等宽字体显示这部分内容,所以在Sample Input和Sample Output里必须用!
 * <ul></ul>是不编号的列表,<ol></ol>是编号的列表,列表里的每一项则是<li></li>,比如"<ul><li>test</li><li>tset</li></ul>", "
{{{
#!html
<ul><li>test</li><li>tset</li></ul>
}}}

同时要注意的是,html里把<和>用作了标签,那么原本的<就要写成"&lt;",>转义成"&gt;",而&转以成"&amp;"。这里有一些[wiki:常用html转义]。

== 图片 ==

我们有一个名为${image-name},描述为${image-usage}的图片,那么需要把它也放在题目目录下上传到ZOJ去。然后在text中,一般就用[[BR]]
> <div style="text-align: center;"><img src="showImage.do?name=${image-name}" alt="${image-usage}"/></div>[[BR]]
来引用图片。在本地测试的时候,可以用[[BR]]
> <div style="text-align: center;"><img src="${image-name}" alt="${image-usage}"/></div>[[BR]]
注意图片要取一些有意义的名字,特别是要注意图片名在整个ZOJ的唯一性('''比如以${image-name}.${image-md5}.${image-suffix}作为文件名''')!所以通常可以用题目名做前缀。

= input =

== "\r\n"与"\n" ==

不同系统下的换行符是不一样的,包括LF (Line feed, "\n", 0Ah) 和 CR (Carriage Return, "\r", 0Dh)

|| "\n" || Unix, Linux ||
|| "\r\n" || Dos, Windows ||
|| "\r" || Mac ||

这点务必注意,ZOJ上必须要用Linux格式的。

linux用户不用操心这一点,所以最好的解决办法是用linux。win上可以用UltraEdit,另存为,换行符选择UNIX换行符。我还建议使用gvim,在.vimrc中加入
{{{
#!python
set fileformats=unix    " 这样就能看出\n和\r\n的区别了 "
set fileformat=unix     " 设置回车为\n "
}}}

Windows用户可以通过 notepad++ 软件来将文件转换成 Linux 换行格式。

== 随机数据是不够的 ==

参见[wiki:怎样出好题]

= output =

== 用solution.cc生成 ==

同样要注意"\r\n"与"\n"的问题。

= solution.cc =

== 不光是AC就好了 ==

参见[wiki:怎样出好题]

== 记得assert ==

作为标称,应该在所有合适的地方加上assert,以确保输入数据符合题目描述。

参见[wiki:怎样出好题]

= checker.cc =

== checker.cc是如何工作的 ==

很遗憾,目前ZOJ的spj只支持名为checker.cc的C++程序,有时候这无疑个写spj带来一个巨大的挑战,好在大多数时候这还是一个比较轻松的工作。spj通过以下方式获得input, output和用户的输出answer:input可以通过只读的打开名为"input"的文件读取;output可以通过只读的打开名为"output"的文件读取(也可以选择不读取这个文件);被测程序的输出的文件名通过命令行第一个参数传给checker,所以可以通过只读的打开名为argv[1]的文件读取。如果最后checker返回0,则judge返回AC,否则judge返回WA。无论如何checker自己都不应该crash。

除非你对数据有绝对的保证,确认不会有合理精度误差导致的WA。否则总是为有较多有效数字的浮点数输出的题目写spj。

== 不要轻易相信提交者的输入 ==

参见[wiki:怎样出好题]

= 题目参数 =

通常我们要把TL放到标称的5倍,甚至给多,而且标程不应该针对自己的input做特别的优化,当然,某些特殊情况,2~3倍也是允许的。通常不要限制ML,有时候还应该提高到64M,没有特殊的理由让人MLE是不好的。OL没什么特别的,不用管。SL通常默认就好了,没有特殊的理由,不要卡交表的程序。

= 如何打包 =

== problems.csv ==

题目的text, input, output, solution.cc, checker.cc还有可能有的一到多张图片放在以题号为名的文件夹下,而题号, TL, ML等参数则要通过一个名为problems.csv的文件来定义。problems.csv 中的每一行对应一个题目,这是一个以逗号分割的标准csv文件,每行的格式为:
> "ID号","题目名",是否spj,时间限制,空间限制,输出文件限制,提交文件限制,"作者"
ID号一定要和那些文件夹名匹配。是否spj用true/false表示。时间限制单位为秒,空间限制、输出文件和提交文件限制单位为kB,这三个一般默认分别取65536, 16000和32。

例如:
> "1001","Jumping Frog",true,1,65536,16000,32,"WANG, Yelei"

> "1002","Collision Ball Game",false,1,65536,16000,32,"LIN, Jiaqiang"

== 打包成zip ==

首先,把每道题的文件各自放到一个文件夹中(有图片的话,图片也要放入同一个文件夹中),文件夹的名字为题号。这样,每个题对应一个以题号为名字的文件夹。然后将创建的problems.csv和所有文件夹打包成一个zip文件就好了,注意problems.csv一定要在zip的根目录下,不要再多一层目录。


= [wiki:预习作业] =
[wiki:预习作业]

题目组成

每道题目需要准备这些文件,放在以题号为名字的目录下,注意文件名是唯一的(*表示非必须,但一般要求有;**表示是可选的):

  • 描述文件(text):这应该是一个html格式的题目描述;
  • 输入文件(input):测试数据的输入部分,如果没有输入,则可以是一个空文件;
  • 输出文件(output):对应的测试数据的输出,在不是Special Judge(spj)的情况下,如果提交的程序输出和这个文件一模一样,就会得到Accepted(AC);
  • *标准程序(solution.cc):这应该是一个采用正确算法,并能AC的程序,虽然不用于Judge,但是通常都是必须提供作为参考的;
  • **特殊判断程序(checker.cc):我们知道有些问题是一题多解或允许精度误差的,那么前面直接和output文件比较的方法就不够了,所以需要spj,spj的题将由这个checker.cc中的程序来judge,规则在后面介绍。

同时,还应该有以下参数:

  • Code:题号,合法的题号长度不能超过8,通常是1001, 1002...或者ABCD...,但往年集训从我的八卦开始,各队都有过七耀、七彩虹、七大元素、基本数据类型等系列题号;
  • Title:标题,描述文件(text)是不包含标题的,标题应该在这里定义,题目标题按照英文习惯,除了冠词和介词,都要首字母大写;英文标题大小写规则
  • Use Checker:是否spj,true or false,如果有,一定要有checker.cc;
  • TL(s):时间限制(Time Limit),通常是2s;
  • ML(KB):内存限制(Memory Limit),通常是65536kB;
  • OL(KB):输出限制(Output Limit),通常是16000kB,超过judge将返回OLE;
  • SL(KB):提交限制(Submit Limit),通常是32kB,超过这个大小的代码无法提交到OJ上;
  • *Author:题目作者,请使用统一的格式:"XING, Mingzi",比如"WU, Zejun";
  • **Source:题目来源,由于都是原创题,一般留空;
  • **Contest:比赛名称,一般会用Contest ${contest-id} By ${group-name},比如Contest 6 by CError,这个由组长统一搞定就好了;

以下说明主要针对格式,而没有对内容做太多说明,其它部分请参考怎样出好题

text

模板

<p>第一段描诉</p><p>第二~N段描诉</p><h4>Input</h4><p>输入说明</p><h4>Output</h4><p>输出说明</p><h4>Sample Input</h4><pre>输入样例</pre><h4>Sample Output</h4><pre>输出样例</pre><h4>Hint</h4><p>这部分非必需,可以在这里对Sample进行解释</p>

基本格式

前面说了,这个就是显示在ZOJ的showProblem.do页面主体部分的题目描述html,不过注意,没有, , 这些标签。严禁用所见即得的网页编辑工具来写这个文件,越是不熟悉html的人越是会产生冗余,不统一,甚至难看的html。请务必使用智能的编辑器,至少要求两点:1、能高亮html的标签匹配;2、能检查<和>的转义。如果不熟悉html,希望下面的东西会对你有帮助,也可以上网搜一些教程。首先,我们可以先建一个名为text.html文件,用gvim来编辑它,再用firefox打开看其效果。

常用到的html标签有这些:

  • ,

    ,除了作为模板中的

    ,不要用这些标签;

  • 表示段落(只有

    ,而没有对应的

    是错误的!),换行使用
    ,具有较好的兼容性(
    是XHTML标准),只应该用在段内换行;
  • 表示黑体,通常用在Input和Output部分需要强调的地方,效果同加粗;
  • 都是斜体,效果同倾斜,英语中常用于作品名称题目描述中所有的变量明要求用斜体,比如"the first line contains n, m and k","the first line contains n, m and k" (变量名的斜体最好使用标签,而其它诸如人名,书名,强调的斜体可以用)
  • 是上标,是下标,比如"ain", "ain"
  • 保留格式,通常html里把多个连续的空格、tab和换行解释为一个空格,用pre则不会这样,而且默认情况下会使用等宽字体显示这部分内容,所以在Sample Input和Sample Output里必须用!
    • 是不编号的列表,
        是编号的列表,列表里的每一项则是
      1. ,比如"
        • test
        • tset
        ", "
      • test
      • tset

      同时要注意的是,html里把<和>用作了标签,那么原本的<就要写成"<",>转义成">",而&转以成"&"。这里有一些常用html转义

      图片

      我们有一个名为${image-name},描述为${image-usage}的图片,那么需要把它也放在题目目录下上传到ZOJ去。然后在text中,一般就用

      div style="text-align: center;">${image-usage}


      来引用图片。在本地测试的时候,可以用

      div style="text-align: center;">${image-usage}

      注意图片要取一些有意义的名字,特别是要注意图片名在整个ZOJ的唯一性(比如以${image-name}.${image-md5}.${image-suffix}作为文件名)!所以通常可以用题目名做前缀。

      input

      "\r\n"与"\n"

      不同系统下的换行符是不一样的,包括LF (Line feed, "\n", 0Ah) 和 CR (Carriage Return, "\r", 0Dh)

      "\n" Unix, Linux
      "\r\n" Dos, Windows
      "\r" Mac

      这点务必注意,ZOJ上必须要用Linux格式的。

      linux用户不用操心这一点,所以最好的解决办法是用linux。win上可以用UltraEdit,另存为,换行符选择UNIX换行符。我还建议使用gvim,在.vimrc中加入

      set fileformats=unix    " 这样就能看出\n和\r\n的区别了 "
      set fileformat=unix     " 设置回车为\n "
      

      Windows用户可以通过 notepad++ 软件来将文件转换成 Linux 换行格式。

      随机数据是不够的

      参见怎样出好题

      output

      用solution.cc生成

      同样要注意"\r\n"与"\n"的问题。

      solution.cc

      不光是AC就好了

      参见怎样出好题

      记得assert

      作为标称,应该在所有合适的地方加上assert,以确保输入数据符合题目描述。

      参见怎样出好题

      checker.cc

      checker.cc是如何工作的

      很遗憾,目前ZOJ的spj只支持名为checker.cc的C++程序,有时候这无疑个写spj带来一个巨大的挑战,好在大多数时候这还是一个比较轻松的工作。spj通过以下方式获得input, output和用户的输出answer:input可以通过只读的打开名为"input"的文件读取;output可以通过只读的打开名为"output"的文件读取(也可以选择不读取这个文件);被测程序的输出的文件名通过命令行第一个参数传给checker,所以可以通过只读的打开名为argv[1]的文件读取。如果最后checker返回0,则judge返回AC,否则judge返回WA。无论如何checker自己都不应该crash。

      除非你对数据有绝对的保证,确认不会有合理精度误差导致的WA。否则总是为有较多有效数字的浮点数输出的题目写spj。

      不要轻易相信提交者的输入

      参见怎样出好题

      题目参数

      通常我们要把TL放到标称的5倍,甚至给多,而且标程不应该针对自己的input做特别的优化,当然,某些特殊情况,2~3倍也是允许的。通常不要限制ML,有时候还应该提高到64M,没有特殊的理由让人MLE是不好的。OL没什么特别的,不用管。SL通常默认就好了,没有特殊的理由,不要卡交表的程序。

      如何打包

      problems.csv

      题目的text, input, output, solution.cc, checker.cc还有可能有的一到多张图片放在以题号为名的文件夹下,而题号, TL, ML等参数则要通过一个名为problems.csv的文件来定义。problems.csv 中的每一行对应一个题目,这是一个以逗号分割的标准csv文件,每行的格式为:

      ID号","题目名",是否spj,时间限制,空间限制,输出文件限制,提交文件限制,"作者"

      ID号一定要和那些文件夹名匹配。是否spj用true/false表示。时间限制单位为秒,空间限制、输出文件和提交文件限制单位为kB,这三个一般默认分别取65536, 16000和32。

      例如:

      1001","Jumping Frog",true,1,65536,16000,32,"WANG, Yelei"

      1002","Collision Ball Game",false,1,65536,16000,32,"LIN, Jiaqiang"

      打包成zip

      首先,把每道题的文件各自放到一个文件夹中(有图片的话,图片也要放入同一个文件夹中),文件夹的名字为题号。这样,每个题对应一个以题号为名字的文件夹。然后将创建的problems.csv和所有文件夹打包成一个zip文件就好了,注意problems.csv一定要在zip的根目录下,不要再多一层目录。

      预习作业

      预习作业

      附加文件