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,主要就是二分不熟悉。
感觉今天的水平发挥出来了,没有什么遗憾,只能说水平还不够,还需要继续加强。
多打,多练,指不定比赛的时候题目都见过。哈哈。
- 2014.08.14 Orz教主第六次模拟赛 总结
- Orz教主第6次模拟赛之保镖排队
- Orz教主第6次模拟赛之教主的别墅
- Orz教主第五次模拟(做题情况+题目分析+代码)[未完]
- Orz教主 bjfu1151 字符串操作
- 第六次总结
- 第六次学习总结
- 若干次模拟赛的总结
- 计算机网络第六次课总结
- 宣传部第六次培训总结
- 第六次周总结---在路上
- 第六次课后作业——总结
- 第六次课总结及思考
- linux兴趣小组暑假第六次讲座总结
- 物联网技术部第六次培训总结
- NCEPU第六次积分赛
- 第六次
- 积分赛第六次两个水题
- 网络安全笔记之防火墙
- 黑马程序员-银行业务调度系统
- jdbc mysql 中文查询不到数据解决
- traits技术学习总结
- nyoj-330-一个简单的数学题
- 2014.08.14 Orz教主第六次模拟赛 总结
- Android调用消息栏通知(Notification)
- cocos2d-x ios游戏开发初认识(五) CCsprite精灵类
- java中的基本数据类型和引用数据类型
- 杭电 1596 find the safest road (最短路)
- Codeforces Round #224 (Div. 2) E.Ksenia and Combinatorics
- 《终结者2》短评 以及对电影分级的思考
- 浏览器无法打开
- 找不到方法 Void Newtonsoft.Json.JsonConvert.set_DefaultSettings