题目内容
题目不得违反国家政策与法律法规,不得出现敏感信息,不得出现强特征的个人、团体、机构等名称。
关于原题
原题大致可分为完全一致、几乎一致和做法一致三种。
- 完全一致:使用一题的AC代码可以AC另一题
- 几乎一致:由一题的 AC 代码改动至另一题的 AC 代码可以由一个不会该题的人完成。
- 做法一致:核心思路、做法一致,但代码实现上、不那么关键的细节上有差异。
这三种原题自下而上为包含关系。
以下情况不应出现:
- 在明知有“几乎一致”的原题的情况下出原题。
- 由于未使用搜索引擎查找导致自己不清楚有原题,从而出了“几乎一致”的原题。
- 在“做法一致”的原题广为人知(如:NOIP、ACM区域赛、知名比赛网站的常规比赛轮次)时出原题。
- 在带有选拔性的考试的非送分题中出现“做法一致”的原题。
以下情况最好不要出现:
- 在明知有至少为“做法一致”的原题的情况下出原题。
- 由于未使用搜索引擎查找导致自己不清楚有原题,从而出了“做法一致”的原题。
- 在任何情况下出“几乎一致”的原题。
题面
题目背景
- 题面背景最好尽可能简短。如果题目背景比较长的时候,应当与题目描述分开。题目背景如果需要有主人公人设,均使用牛牛、牛妹等。
题目描述
要求清晰易懂
题面中的每个可能不被理解的定义都应得到解释,不应凭空冒出未加定义的概念。如:"子序列"和"子串"的定义,对于一些概存在极限情况的概念也应做解释,如:一个点是否是一棵XX树。
题面中涉及到的每个概念应当使用单一的词汇来描述。如:不应一会儿说“费用”,一会儿说“代价“。
保证你的题面不会自相矛盾,保证题面不能被错误理解而自圆其说,即使这种理解是反常识、没有人会这么去想的。
顺着读题目描述应当能看懂每一句话,并理解题目的任务与要求。不能需要看了输入输出格式才能明白题意,甚至需要根据样例来猜题意。
同一题目的变量名大小写应该同一,不应出现在某处是
,而在另一处变成
的情况。同时建议变量与题目相关时使用小写,无关时(如数据组数
)使用大写。
题目中的公式符号和数字都应用
书写,由于nowcoder录题系统
的特性,对于单个字母或者数字会转义失败变成普通文本,此时对于字母应加\mathit,数字应加\text.
如:
应写为:
$\mathit n$
应写为:
$\text 1$
或者
将写好的公式,先复制到牛客讨论区的markdown预览中,然后复制回来即可。
输入输出格式
- 输入输出格式清晰完整即可,没有死板的要求,需要特别注意的是,如果输出中含有小数,请尽量使用
。如果无法使用
,请保证对精度的要求是有限的。
数据范围
数据范围都统一为写在输入格式里,数据范围中最容易犯的错误就是不完整。输入中的每一个数、每一个字符串都应该有清晰的界定。在上文所给出的输入输出格式示例中就有一些数据范围的正确写法。
如果单个测试点包含多组数据,应在输入格式中加粗说明「本题有多组数据」。
描述多个并列的变量时,应合并为一个公式。
数据类型(如整数、实数、字符等)应在输入格式中说明,数据范围应在说明/提示中说明。数据范围必须有上界和下界的描述,字符串必须有字符集的描述,实数必须有小数点后位数的描述。因此输入格式中不必说明「正整数」或「非负整数」而只需说明「整数」。
除部分特殊情况外,数据范围中
的数应使用科学计数法 或者使用
\,
进行三位一分隔。不同变量的数据范围应分开为多个公式,即要求公式与公式之间用全角逗号隔开。特别地,若存在多个变量的数据范围相同,也可以合并为同一个公式。
部分分应描述为「对于
的数据」而不是「对于50%的数据」。
数据范围的常见遗漏:
- “整数”中的“整”。
- 题面中只说了是“整数”没说是“正整数”,并且数据范围中只有上限没有下限。
- 字符串没说字符集。
- 实数没说小数点后位数。
- 某些变量没有给范围。
你需要保证标程可以通过满足题面所述数据范围的任何一组数据。
样例
- 样例应当有一定的强度,能够查出一些简单的错误。读错题意的人应当能够通过样例发现自己读错了题意。
- 有多种操作的题,每种操作都应在样例中出现。有多种输出的题,每种可能的输出都应在样例中出现。
- 如果提供大样例,可以在数据范围处用 markdown 的链接指向一个剪贴板或网盘,而非直接简单地粘贴到样例里面。
样例说明
- 题目描述越复杂、越不易理解就越应当有详细的样例说明,题目难度越简单就越应当有详细的样例说明。一般来说,一道题至少应该有一个样例说明。
时限、空间限制与部分分
时限与空间限制的目的是卡掉复杂度错误的做法。尽可能保证单题评测极限情况总时间为以内。
因此,原则上时间限制应当选取不使错误做法通过的尽量大的值。
一般地,时限应满足以下要求:
- 至少为 std 在最坏情况下用时的三倍。
- 不应使错误做法通过(实在卡不掉、想放某种错解过除外)。
部分分一般分为较小数据范围与特殊性质两种。
较小数据范围一般要设置多档,即使你想不到某种复杂度的做法,也可以考虑给这种复杂度一档分。一般来说,为了避免卡常,可以设置一档极限数据除以二的部分分。
“数据有梯度”最好用多档部分分替代。
特殊性质部分分的设置要依具体题目而定。理想的特殊性质部分分应当是能够引导选手思考正解的。与较小数据范围部分分不同,在你不会针对某种特殊性质的做法时,最好不要给这种特殊性质一档分。
Special Judge
写法规范参见如何在牛客网出Special Judge的编程题
- 你需要应对各种不合法的输出,因此,请检查读入的每个变量是否在合法范围中(
readInt(minvalue, maxvalue)
)。例如:读入一个在 check 过程中会作为数组下标的变量时必须检查其范围,否则可能引发数组越界,有时这会导致 RE,有时则可能判为 AC。这一点,可以在polygon打包检查的时候检查到部分。我们建议使用polygon作为spj的辅助测试工具。 - 原则上 checker 中不应检查空白字符(即,不应使用 readSpace()、readEoln()、readEof(),值得一提的是,testlib.h 会自动检查是否有多余的输出)。
题解和标程
题解的目标是让可能来参加本次比赛的选手都能看懂题解,所以在对应不同难度水平下,也需要尽可能详尽。
标程中最好去掉冗余部分。比如,有人在题解中保留了完整的 define 模板(为了提高做题速度,包含大量 define 与常用函数,常用于 CF 等在线比赛),并且其中很大一部分都没有用到,这是不好的。
参考资料
规则
在以下情况下,Nowcoder有权拒绝支付部分或者全部出题费用:
一、提前向他人透露题意或解题思路并且被广为传播;
二、出错题,包括但不仅限于提供错误解法并最终发现题目不可做;
三、标程有错误且对比赛造成了影响;
最终解释权归Nowcoder所有。