Created
October 20, 2013 03:19
-
-
Save chengluyu/7064621 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
\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