2014.08.14 Orz教主第六次模拟赛 总结

来源:互联网 发布:机器人编程好学吗 编辑:程序博客网 时间:2024/05/20 05:08

今天迎来了Orz教主的最后一次模拟赛。

总分400 ,230 , Floz同学220分Rank2,但是他是隐藏的Rank1(T1他只有20,实际得分应该是300)。

话不多说,上题,上总结。【本次的题目在tyvj均有原题】


T1 : 教主的花园 

        可以把教主的花园附近区域抽像成一个正方形网格组成的网络,每个网格都对应了一个坐标(均为整数,有可能为负),若两个网格(x1, y1),(x2, y2)有|x1 – x2| + |y1 – y2| = 1,则说这两个网格是相邻的,否则不是相邻的。
  教主在y = 0处整条直线上的网格设置了一道屏障,即所有坐标为(x, 0)的网格。当然,他还要解决他自己与内部人员的进出问题,这样教主设置了N个入口a1, a2, …, aN可供进出,即对于y = 0上的所有网格,只有 (a1, 0),(a2, 0), ……, (aN, 0) 可以通过,之外的所有纵坐标为0的网格均不能通过,而对于(x, y)有y不为0的网格可以认为是随意通过的。
  现在教主想知道,给定M个点对(x1, y1),(x2, y2),并且这些点均不在屏障上,询问从一个点走到另一个点最短距离是多少,每次只能从一个格子走到相邻的格子。

数据范围:

  对于20%的数据,有n,m≤10,ai,xi,yi绝对值不超过100;
  对于40%的数据,有n,m≤100,ai,xi,yi绝对值不超过1000;
  对于60%的数据,有n,m≤1000,ai,xi,yi绝对值不超过100000;
  对于100%的数据,有n,m≤100000,ai,xi,yi绝对值不超过100000000。


       仔细读题 ,题目大意就是:在X轴上设立N个出入口(ai,0),穿过X轴时必须从这些点穿过,不能走X轴上其他的点。给定M个点对(x1, y1),(x2, y2),求两点之间的距离,每次只能向上下左右四个方向走一个单位。

      对于每个点对,有两种可能:

      一、不用穿过X轴【直接相减】

      二、要穿过X轴 【找到最近的出入口,使得两个点到出入口的距离和最小】

      要找最近的出入口,只需要最多O(N),用二分可以在(log N)解决。总时间O(M log N)。


T2 教主泡嫦娥

题目:(太长,我就总结一下)

题目大意:给出一个高度序列H[i],要从中任选一个点作为起点走一圈【没错走一圈,H[n]下一个就是H[1]】。

教主可以选择从任意一个落脚点开始,顺时针或者逆时针走,每次走到一个相邻的落脚点,并且最后回到这个落脚点。
  教主在任意时刻,都会有“上升”、“下降”两种状态的其中一种。

  当教主从第i个落脚点(H[i]),走到第j个落脚点(H[j])的时候(i和j相邻)
  j的海拔高于i的海拔:如果教主处于上升状态,教主需要耗费两段高度差的绝对值的体力;否则耗费高度差平方的体力。
  j的海拔低于i的海拔:如果教主处于下降状态,教主需要耗费两段高度差的绝对值的体力;否则耗费高度差平方的体力。

       当然,教主可以在到达一个落脚点的时候,选择切换自己的状态(上升→下降,下降→上升),每次切换需要耗费M点的体力。在起点的时候,教主可以自行选择状态并且不算切换状态,也就是说刚开始教主可以选择任意状态并且不耗费体力。

       求:走一圈的最小体力花费

数据范围:

       对于10%的数据,N ≤ 10;
  对于30%的数据,N ≤ 100,a[i] ≤ 1000;
  对于50%的数据,N ≤ 1000,a[i] ≤ 100000;
  对于100%的数据,N ≤ 10000,a[i] ≤ 1000000,M ≤ 1000000000;


对于50%的数据,是比较容易想到的。设F[I,0/1]为走了I步时,状态为上升/下降的最小体力花费,枚举起点,O(N^2)。

博主一开始也是这么想的,但是想让它再快一点,就再加了一维表示变化次数。其实完全没有用,反而导致自己只有30分。


对于100分,有水法也有N log N法

水法:哈哈只要从高度最低或者高度最高的走一遍就可以了【不知道为什么能过】

水法2:当状态转移到快超时的时候直接输出当前答案【卡时!】【数据较水导致答案出现在前方】

水法3:随机起点【随机次数稍微多一点,在保证不超时不重复枚举的情况下,还是有可能过得】


N log N法:F[i,j] 表示 i 到 i+2^j 的最小代价,F[i , j] + F[i + 2^j , j] = F[i , j + 1] 对于杂项我们可以用倍增的思想解决,总复杂度O(N log N)


T3:保镖排队

题目大意:给出一棵树,以及相同父亲的儿子节点的顺序。现要求给所有节点排出一个序列,要求:1、父亲出现在儿子的前面;2、儿子节点的相对顺序不能变

如       1                             1的儿子是2 3 4 ,顺序为2 3 4

  2      3     4                       2的儿子是5 6 ,顺序为5 6

5  6

  1 2 3 4 5 6 / 1 2 3 5 6 4 / ……为合法序列  

  1 2 4 3 5 6 / 1 2 3 4 6 5 / 1 5 6 2 3 4 /……为不合法序列

求 合法序列方案数。


这是个较明显的树形DP,根据左儿子右兄弟多叉转二叉之后,规定排名先的兄弟在上面【深度较浅】,这样一来,对于节点X,他必须出现在他的儿子节点和兄弟节点之前,也就是L[X] 和 R[X]之前。

对于节点X,左儿子和右儿子的方案是互相没有影响的。F[X] = F[U] * F[V] (u为左儿子,v为右儿子,F为方案数)

设左儿子共有N个点,右儿子共有M个点,合并之后是一个N*M的序列,有C(N , N + M)种方案。

所以 F[X] = F[U] * F[V] * C(SUM[U] , SUM[U] + SUM[V]);

F[1]即为答案。


T4 教主的别墅

题目: 教主一共雇佣了N个LHXee,这些LHXee有男有女。
  教主的大别墅一共有M个房间,现在所有的LHXee在教主面前排成了一排。教主要把N个LHXee分成恰好M个部分,每个部分在队列中都是连续的一段,然后分别去打扫M个房间。
  教主身为全世界知识最渊博的人,他当然知道男女搭配干活不累的道理,以及狼多羊少,羊多狼少的危害之大。所以教主希望一个分配方式,使得所有小组男女个数差的最大值最小。
  教主还希望你输出从左到右,每个组的人数。
  如果有多种人数组合都能达到最优值,教主希望你分别告诉他这些方案中字典序最小和最大的方案。换句话说,你需要找到两种方案,这两种方案满足所有组男女个数差最大值最小的前提下,第一种方案(字典序最小)要越靠前的组人数越少,也就是让第一个小组人尽量少,并且在第一个小组人尽量少的前提下,让第二个小组的人尽量少,依此类推;第二种方案(字典序最大)则要让越靠前的组人数越多。

数据范围: 

      对于40%的数据,有N ≤ 100;
  对于50%的数据,有N ≤ 1000;
  对于65%的数据,有N ≤ 100000;
  对于100%的数据,有N ≤ 5000000,M ≤ N且M ≤ 100000。


如果不要求找出方案,只要求求出最优值,这一题就相对简单一些。

设男为1 , 女为-1 , 计算前缀和。

ans = s[n] / m (向上取整)。 即 ans = (s[n] - 1)/ m + 1;【s[n] 取绝对值】

对于总和为s[n]的序列,一定可以分成M段,使得每一段的差值都不超过ans。

暴力枚举每一段的长度,假设当前要分成K段,这种长度能成为一种方案的前提是 这一段的差值不超过ans;剩下的数分成K - 1段的差值最大值也不超过ans     

即 abs(s[end] - s[start - 1]) <= ans , (abs(s[n] - s[end]) - 1) / (k - 1) + 1<= ans;

这样就可以求出一个方案,字典序最小就从1开始扫能分就分,最大就从N开始扫能分就分。注意s[n] = 0需要特判。


今天的题目难度还是不算大的,比赛时我想出了一三题,在打第一题的时候花了将近1h,主要就是二分不熟悉。

感觉今天的水平发挥出来了,没有什么遗憾,只能说水平还不够,还需要继续加强。

多打,多练,指不定比赛的时候题目都见过。哈哈。

0 0
原创粉丝点击