Skip to content

Instantly share code, notes, and snippets.

@chengluyu
Created October 20, 2013 03:19
Show Gist options
  • Save chengluyu/7064621 to your computer and use it in GitHub Desktop.
Save chengluyu/7064621 to your computer and use it in GitHub Desktop.
\documentclass{ctexart}
\usepackage[margin=1.5cm]{geometry}
\usepackage{CJK}
\usepackage{verbatim}
\DeclareMathSizes{12}{20}{14}{10}
\title {东营市第一中学信息学信息学奥赛第一次模拟赛题解}
\author {作者:做好事不留名}
\begin{document}
\maketitle
作者说:我只是来练习\LaTeX 排版系统的。
\section{老师的信件}
Ad Hoc类问题,因为题目数据量只有1000,所以怎么搞都可以。
容易想到的方法是将序号和特征码存入两个数组$A[1..N]$和$B[1..N]$中,对$A$ 进行排序的同时移动$B$中的元素,最后顺序输出即可。这种方法适用于懒人,尤其是C++有排序库函数的情况下。
但是注意有一种更快的方法,可以在$O(N)$的时间内解决问题,创建一个桶数组$C[1..N]$,然后对于每一个$1\leq j\leq N$,进行$C[A[j]]=B[j]$ 即可。
至于题目中所给出的浮点数,完全可以用字符串来处理,因为它并不参与整个计算过程。
\section{饥饿的奶牛}
动态规划问题。实际上是一个线段带权值的加强版线段覆盖。
在开始算法之前,先以左端点为第一关键字、右端点为第二关键字对线段排序。用$f(i)$表示选取以第$i$条线段为结尾的线段子序列能得到的最大价值,则状态转移方程可以如下表示:\large$$f(i)=max\{1\leq j<i\wedge L_i>R_j|f(j)+W_i\}$$。其中$L_i$、$R_i$和$W_i$分别表示第$i$条线段的左端点、右端点、权值。
\section{和为零}
搜索。
我们可以枚举每一种状态,因为题目中$N$最大为$9$,状态最多有$3^8=6561$种(注意不是$3^9$,因为$N$个数之间只有$N-1$ 个运算符),所以穷举并不会不会超时。大体上伪代码如下:
\begin{verbatim}
procedure DFS(n):
if n = N
计算表达式,结果为零则输出表达式
else
将第n个符号改为空格
DFS(n + 1)
将第n个符号改为加号
DFS(n + 1)
将第n个符号改为减号
DFS(n + 1)
\end{verbatim}
注意伪代码中“空格”、“加号”、“减号”的顺序是按照ASCII码来排序的,这样可以保证最后输出是按照ASCII码排序的结果。
\end{document}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment