从 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">
<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>
</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里把<和>用作了标签,那么原本的<就要写成"<",>转义成">",而&转以成"&"。这里有一些[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里必须用!
- test
- tset
- test
- tset
同时要注意的是,html里把<和>用作了标签,那么原本的<就要写成"<",>转义成">",而&转以成"&"。这里有一些常用html转义。
图片
我们有一个名为${image-name},描述为${image-usage}的图片,那么需要把它也放在题目目录下上传到ZOJ去。然后在text中,一般就用
div style="text-align: center;">
来引用图片。在本地测试的时候,可以用
div style="text-align: center;">