文章目录
前言
✨✨✨ 如果您对这篇文章感兴趣,可以点击【导航页 - 访客必读】一文囊括主页所有优质博客 查看更多优质内容,希望可以帮您解决更多问题~。 ✨✨✨
ACM/ICPC/CCPC等各类算法竞赛对于题面都有比较严格的要求,一份不合格的题面会给选手带来非常差的阅读体验,甚至可能会使得题意出现歧义等。
因此,对于算法竞赛而言,一份规范的题面非常重要,本篇文章将给出一份详细的规范题面撰写指南。
本文将分为题面撰写注意事项、题面撰写方法两大部分,其中目前主流的题面撰写方法有基于olymp.sty的LaTeX方法
和基于polygon平台的一键导出
两种方式,但由于polygon平台对于新手而言有一定的学习成本、平台访问速度不稳定等因素,因此本教程将详细介绍基于olymp.sty的LaTeX方法
。
博客有任何错误或者大家有任何问题,都可以直接在评论区留言~
如果我的博客成功解决了您的问题,烦请一件三连 (▽),不胜感激!
1.题面撰写注意事项
本部分主要参考 OI-Wiki
1.1 题目背景
- 尽量简短,题目背景非题面必需,可以省略
- 题目背景不可以影响选手对题意的理解
1.2 题目描述
- 每个可能不被理解的定义都应该得到解释
例如,题目涉及到了下取整的符号, ⌊ x y ⌋ \lfloor \frac{x}{y}\rfloor ⌊yx⌋,那么你就需要额外添加对下取整的解释,
向下取整是指将一个实数向下舍入到最接近的、不超过它的整数。用数学符号表示为 ⌊x⌋,其中 x 是实数。例如,⌊3.8⌋=3,
⌊3.8⌋=3,⌊−2.4⌋=−3, ⌊−2.4⌋=−3。
- 对可能被误解的多义词,给出详细说明
例如不能不加说明地用“路径”代指“一条边”
- 相同概念要用同一词汇来描述
例如,不应该一会说“费用”,一会说“代价”
-
题目不能有歧义,且错误的理解可以被说通
-
题面不可自相矛盾
1.3 输入输出格式
- 尽量在输入输出格式中说明每个变量的具体含义
除非变量的意义非常长,没法一句话说清楚(这时可以说「意义见题目描述」)
- 如果输出含有小数,尽量用SPJ来限制误差,而不是“要求保留x位小数”
例如,若保留3位小数,期望答案为0.0015,那么只要有任何答案小于0.0015,即使0.00149999…都会被判WA,显然不合理。
若无法使用SPJ,请保证对精度的要求是有限的,例如:请输出答案四舍五入后保留小数点后三位的结果。令标准答案为 ans,数据保证对于任意满足 ∣ x − a n s ∣ max ( 1 , a n s ) < 1 0 − 9 \frac{|x-ans|}{\max(1,ans)}<10^{-9} max(1,ans)∣x−ans∣<10−9的 x,四舍五入后结果与 ans 四舍五入后相同。
- 表述可以参考下列句子
输入的第一行包含三个正整数 $n$, $m$, $k$ ($1\le n,m\le 2\cdot 10^5$, $1\le k\le 100$) — $n$ 表示数列的长度,$m$ 表示操作个数,$k$ 的意义见题目描述。
输入的第二行包含 $n$ 个非负整数 $a_1,a_2,\ldots,a_n$ ($1\le a_i\le 10^9$) — 题目给出的数列。
接下来的 $m$ 行中的第 $i$ 行包含两个正整数 $l_i$ 和 $r_i$ ($1\le l_i\le r_i\le n$),表示第 $i$ 次操作在区间 $[l_i,r_i]$ 上进行。
接下来的 $n-1$ 行,每行包含两个正整数 $u$ 和 $v$ ($1\le u,v\le n$),表示 $u$ 和 $v$ 之间由一条边相连。
数据保证给出的边能构成一棵树。
输入的唯一一行包含一个由小写英文字母构成的非空字符串,其长度不超过 $10^6$。
输入的第二行包含一个小数点后不超过三位的实数 $x$ ($-10^6\le x\le 10^6$),意义见题目描述。
输出包含一个实数,当你的输出与标准答案之间的绝对误差或相对误差小于 $10^{-6}$ 时视作正确。
输出的第二行包含 $n$ 个正整数,表示你构造的一组方案 — 其中第 $i$ 个数表示你打出的第 $i$ 张牌的编号。
如果有多组合法的答案,可以任意输出其中一组。
1.4 数据范围
一般来说,数据范围写在输入格式里或者题目最后都可以,XCPC竞赛往往采用前者。
- 数据范围的描述一定要完整
下面是常见错误:
- 「整数」中的「整」。
- 题面中只说了是「整数」没说是「正整数」,并且数据范围中只有上限没有下限。
- 字符串没说字符集。
- 实数没说小数点后位数。
- 某些变量没有给范围。
1.5 样例
- 样例应当有一定的强度
能够查出一些简单的错误。读错题意的人应当能够通过样例发现自己读错了题意。
-
有多种操作的题,每种操作都应在样例中出现
-
有多种输出的题,每种输出都应在样例中出现
例外:实际上不可能无解但还要判断是否有解的题目。
2.题面撰写方法(基于olymp.sty的LaTeX方法)
2.0 模板及测试用例
我在此给出模板及测试用例的百度网盘链接。
2.1 配置LaTeX环境
推荐采用WSL2+VsCode+LaTeX的配置方法,详见此教程。
2.2 下载olymp.sty
可以在github下载官方原版文件或者针对中文修改后的文件(前者不支持中文),下载完成后命名为olymp.sty
,保存在LaTeX工作目录下(与main.tex
同一目录),如下图:
如果访问github有困难,也可以直接用我在2.0节给出的链接中的olymp.sty
。(给出的是针对中文修改后的文件)
2.3 main.tex
模板用法
具体main.tex
文件内容如下:(详细注释版)
\documentclass[11pt,a4paper,chinese]{ctexart} % 文档类型为ctexart,基础字号 11 磅,纸张尺寸 A4,支持中文
% 加载各种宏包
\usepackage{ctex}
\usepackage{array,lastpage,amsmath,amssymb,mathtools,enumitem,graphicx,multirow,tocbibind,longtable,makecell,varwidth,titlesec,bm,booktabs,comment,qtree,listings,tikz,flowchart,algorithm,algorithmic}
\usepackage{olymp}
\usepackage{fancyhdr}
% \setCJKmainfont[BoldFont=Heiti SC Medium]{Songti SC Light}
\setCJKmainfont[BoldFont=SimHei]{SimSun}
% 页眉页脚设置
\pagestyle{fancy}
\fancyhf{}
\rhead{\sffamily\normalsize 年/月/日} % 右页眉:日期
\lhead{\sffamily \normalsize 比赛标题} % 左页眉:比赛名称
\renewcommand{\headrulewidth}{.7pt} % 页眉线宽
\renewcommand{\footrulewidth}{.7pt} % 页脚线宽
\setlength{\headsep}{15pt} % 页眉与正文间距
\cfoot{\sffamily \normalsize Page \thepage \ of \pageref{LastPage}} % 页脚居中显示页码
% 居中显示 verbatim 内容(如输入输出样例)
\usepackage{varwidth}
\newenvironment{centerverbatim}{\par\centering\varwidth{\linewidth}\verbatim}{\endverbatim\endvarwidth\par}
\usepackage[thinlines]{easytable}
% 代码高亮配置:代码自动换行、禁用边框、使用等宽字体
\lstset{escapeinside=``, breaklines=true, frame=none, extendedchars=false, basicstyle=\ttfamily, showstringspaces=false}
% 优化中文排版
\setlength{\parindent}{2em} % 首行缩进 2 字符
\setlength{\parskip}{2.0ex} % 段间距 2 倍行高
\linespread{1.15} % 行距 1.15 倍
% 数学符号简写
\newcommand*{\mat}[1]{\boldsymbol{\mathrm{#1}}} % 粗体矩阵
\renewcommand*{\vec}[1]{\boldsymbol{\mathrm{#1}}} % 粗体向量
% 绘图工具配置
\usepackage{tikz,flowchart}
\usetikzlibrary{shapes,shapes.geometric,arrows,automata,positioning}
\usepackage{pgfplots}
% 正文
\begin{document}
\input A.tex
\input B.tex
\end{document}
- 第1行
\documentclass[11pt,a4paper,chinese]{ctexart}
中的chinese
表示子项目名称以中文显示,例如:
如果想要设置为英文,将chinese
改成english
即可。
- 第10行
\setCJKmainfont[BoldFont=SimHei]{SimSun}
根据自己电脑上已安装的字体进行设置即可。
可以通过此教程的“补充”部分,在WSL中使用Windows字体。
如果不确定自己系统上已安装的字体是什么,linux系统可以通过fc-list :lang=zh
查看
- 第15行
\rhead{\sffamily\normalsize 年/月/日}
和第16行\lhead{\sffamily \normalsize 比赛标题}
用于设置比赛日期和比赛名称
- 第46和第47行为正文的核心部分(即
\begin{document}
和\end{document}
中间)
正文核心部分通过\input tex文件名
来加载同目录下的其他tex文件,这样做可以使得main文件更加简化,便于修改和管理。
最终题面PDF
的题目顺序,将按照此处文件的顺序按ABCDE...
进行编号。
2.4 A.tex
模板用法
其中,
A.tex
可以替换为任意的tex文件。
具体模板为:
\begin{problem}{标题}{standard input}{standard output}{1 s}{256 MB}
这里写题目描述。
\begin{figure}[H]
\centering
\includegraphics[width=0.5\textwidth]{蛋仔.png}
\end{figure}
\InputFile
第一行:三个整数$n,m,k$,其中$n$和$m$表示地图尺寸,$k$表示蛋仔数
接下来$k$行:每行两个整数$x,y$,表示相应蛋仔的坐标
$1 \leq n, m \leq 100,0 \leq k \leq 100,1 \leq x \leq n,1 \leq y \leq m$
一个单元格中可能有多个蛋仔
\OutputFile
共一行:如果小H获胜,输出"YES",否则,输出"NO"(不包含引号)。
\Examples
\begin{example}
\exmp{%
3 2 1
2 1
}{%
YES
}%
\exmp{%
9 9 0
}{%
NO
}%
\exmp{%
20 20 4
10 10
10 10
10 10
10 10
}{%
NO
}%
\end{example}
\Note
这里是提示信息
\end{problem}
- 第1行
\begin{problem}{标题}{standard input}{standard output}{1 s}{256 MB}
标题自定义即可,不需要添加题号;
后四项分别为输入文件、输出文件、时间限制、空间限制
- 第4行
这里写题目描述
在此处写题面正文,各种LaTex格式大家自行搜索即可。
- 子项目解释
以第12行\InputFile
为例,\InputFile
后接输入格式,例如:
注意各个子项目如Input
、Output
、Explanations
等均非必须,根据自己需求添加即可。
各个子项目的详细解释见olymp.sty
的\if@chinese
部分,大家根据自己需求来进行设置即可。
\if@chinese
\def\kw@ProblemTutorial{题目解答}
\def\kw@Problem{Problem}
\def\kw@ProblemAuthor{题目作者:}
\def\kw@ProblemDeveloper{题目开发者:}
\def\kw@ProblemOrigin{题目来源:}
\def\kw@InputFileName{输入文件:}
\def\kw@OutputFileName{输出文件:}
\def\kw@TimeLimit{时间限制:}
\def\kw@MemoryLimit{内存限制:}
\def\kw@Feedback{反馈方式:}
\def\kw@stdin{标准输入流}
\def\kw@stdout{标准输出流}
\def\kw@Background{背景知识}
\def\kw@Specification{题目要求}
\def\kw@Interaction{交互}
\def\kw@Input{输入格式}
\def\kw@Output{输出格式}
\def\kw@Example{样例}
\def\kw@Examples{样例}
\def\kwExampleNotes{样例说明}
\def\kw@Explanation{样例解释}
\def\kw@Explanations{样例解释}
\def\kw@Illustration{图表说明}
\def\kw@Scoring{评分}
\def\kw@Note{提示}
\def\kw@Notes{提示}
\def\kw@Constraints{约束}
\def\kw@version{版本}
\def\kw@revision{版本}
\def\kw@SubtaskOne{子任务 1}
\def\kw@SubtaskTwo{子任务 2}
\def\kw@SubtaskThree{子任务 3}
\def\kw@SubtaskFour{子任务 4}
\def\kw@SubtaskFive{子任务 5}
\def\kw@SubtaskSix{子任务 6}
\def\kw@Subtask{子任务}
\def\kw@points{分}
\def\kw@Page{Page}
\def\kw@of{of}
\def\kw@notstated{未说明}
\def\kw@IntentionallyBlankPage{此页故意留白}
\def\kw@defaultinputname{test}
\def\kw@defaultoutputname{answer}
- 特别注意:样例部分
请务必按照下列格式编写样例:
\Examples
\begin{example}
\exmp{%
3 2 1
2 1
}{%
YES
}%
\exmp{%
9 9 0
}{%
NO
}%
\exmp{%
20 20 4
10 10
10 10
10 10
10 10
}{%
NO
}%
\end{example}
每个样例用\exmp
表示,务必在每个大括号后边都加上百分号%
,如下图:
至于不加%
会发生什么,大家自己尝试一下就知道了~
2.5 编译
编译后会生成相应的PDF
文件,如下图:
常见问题及对应解决方案
目前按照本教程进行操作,还未遇到任何问题。
欢迎大家将自己遇到的问题回复在评论区中,我会积极解答并将其补充到博客中,大家共同进步!