ACM/ICPC/CCPC等算法竞赛规范题面撰写详细教程(全网最详细,看完包懂)

前言


✨✨✨ 如果您对这篇文章感兴趣,可以点击【导航页 - 访客必读】一文囊括主页所有优质博客 查看更多优质内容,希望可以帮您解决更多问题~。 ✨✨✨


ACM/ICPC/CCPC等各类算法竞赛对于题面都有比较严格的要求,一份不合格的题面会给选手带来非常差的阅读体验,甚至可能会使得题意出现歧义等。

因此,对于算法竞赛而言,一份规范的题面非常重要,本篇文章将给出一份详细的规范题面撰写指南。

本文将分为题面撰写注意事项题面撰写方法两大部分,其中目前主流的题面撰写方法有基于olymp.sty的LaTeX方法基于polygon平台的一键导出两种方式,但由于polygon平台对于新手而言有一定的学习成本、平台访问速度不稳定等因素,因此本教程将详细介绍基于olymp.sty的LaTeX方法


博客有任何错误或者大家有任何问题,都可以直接在评论区留言~

如果我的博客成功解决了您的问题,烦请一件三连 (),不胜感激!

1.题面撰写注意事项

本部分主要参考 OI-Wiki

1.1 题目背景

  1. 尽量简短,题目背景非题面必需,可以省略
  2. 题目背景不可以影响选手对题意的理解

1.2 题目描述

  1. 每个可能不被理解的定义都应该得到解释

例如,题目涉及到了下取整的符号, ⌊ x y ⌋ \lfloor \frac{x}{y}\rfloor yx,那么你就需要额外添加对下取整的解释,

向下取整是指将一个实数向下舍入到最接近的、不超过它的整数。用数学符号表示为 ⌊x⌋,其中 x 是实数。例如,⌊3.8⌋=3,
⌊3.8⌋=3,⌊−2.4⌋=−3, ⌊−2.4⌋=−3。

  1. 对可能被误解的多义词,给出详细说明

例如不能不加说明地用“路径”代指“一条边”

  1. 相同概念要用同一词汇来描述

例如,不应该一会说“费用”,一会说“代价”

  1. 题目不能有歧义,且错误的理解可以被说通

  2. 题面不可自相矛盾

1.3 输入输出格式

  1. 尽量在输入输出格式中说明每个变量的具体含义

除非变量的意义非常长,没法一句话说清楚(这时可以说「意义见题目描述」)

  1. 如果输出含有小数,尽量用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)xans<109的 x,四舍五入后结果与 ans 四舍五入后相同。

  1. 表述可以参考下列句子
输入的第一行包含三个正整数 $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. 「整数」中的「整」。
  2. 题面中只说了是「整数」没说是「正整数」,并且数据范围中只有上限没有下限。
  3. 字符串没说字符集。
  4. 实数没说小数点后位数。
  5. 某些变量没有给范围。

1.5 样例

  1. 样例应当有一定的强度

能够查出一些简单的错误。读错题意的人应当能够通过样例发现自己读错了题意。

  1. 有多种操作的题,每种操作都应在样例中出现

  2. 有多种输出的题,每种输出都应在样例中出现

例外:实际上不可能无解但还要判断是否有解的题目。

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后接输入格式,例如:

在这里插入图片描述

注意各个子项目如InputOutputExplanations等均非必须,根据自己需求添加即可。

各个子项目的详细解释见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文件,如下图:在这里插入图片描述

常见问题及对应解决方案

目前按照本教程进行操作,还未遇到任何问题。

欢迎大家将自己遇到的问题回复在评论区中,我会积极解答并将其补充到博客中,大家共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值