01day2
小明搬家
模拟
【问题描述】
小明要搬家了,大家都来帮忙。
小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼。
最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了。最后大家发现这样混乱地搬运过程效率太低了,于是总结出了提高效率的方法。
大家的速度都是每分钟上(或下)一层楼。所有向上走的人手中都拿一个箱子,所有向下走的人手中都不拿箱子。到达第N层立刻放下箱子向下走,到达第1层立刻拿起箱子向上走。当一个人向上走,另一人向下走而在楼道里相遇时,向上走的人将手中的箱子交给另一人,两人同时反向。即原来拿箱子向上走的人不拿箱子向下走,原来不拿箱子向下走的人现拿着箱子向上走。
求将所有箱子搬完所需的最短时间。
【输入】
第一行N(N≤10^9),K(K≤500000),M(M≤10^9),分别表示楼层数、人数、还放在一楼地上的箱子数。
接下来K行,每行两个数Ai,Bi。
Ai表示第i人现所在的楼层数,Bi为0或1,为0表示第i人正拿着箱子向上走,为1表示第i人不拿箱子向下走。
输入满足没有任意两人正在同一楼层,在第1层的人一定正拿着箱子向上走,在第N层的人一定正不拿箱子向下走。
【解题过程】
首先想到了白书上的“蚂蚁”一题,主要思想是:两人相遇后掉头其实相当于两个人只是擦肩而过,路线并没有变,只要交换一下两人的序号即可。而这道题并不要求输出每个人的状态,所以连序号也不用交换。
然后注意到对于每个人经过 2n-2 的时间之后必然会回到当前状态而且已经搬运了一个箱子,那么对于整体而言,每过 2n-2 的时间就会少掉 k 个箱子。所以前 (m div k)*k 个箱子的搬运时间就等于 (m div k)*(2n-2)。
然后考虑剩下的箱子。此时所有人都回到了初始状态。由于初始状态中某些人正在运输物品(这些物品是不算到 M 里面的),所以可以先让这些人把自己的箱子运输完。
此时剩下的箱子数为 m mod k。对于每个人我们可以计算出其搬运一个箱子所需的时间,那么我们只需将这些时间排序,第 m mod k 个时间就是所有搬运完成的时间。
初始得分 50 分,因为没有用 long long 所以有些地方就挂了。
圆圈舞蹈
二分答案+前缀和
【问题描述】
熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。
奶牛想知道两只最远的奶牛到底隔了多远。奶牛A 到B 的距离为A 顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。
【输入】
第一行一个整数N,表示有N 只奶牛。(2≤N≤100000)
接下来2~N+1 行,第I 行有一个数,表示第I-1 头奶牛顺时针到第I 头奶牛的距离。(1≤距离≤maxlongint,距离和≤maxlongint)
第N+l 行的数表示第N 头奶牛顺时针到第1 头奶牛的距离。
【解题过程】
首先想到的是枚举起点和终点,这样做的复杂度是 O(n^2),显然不够。
然后想到二分枚举答案。对于每个点,距其最远的点当然是在其对面,越接近其“正对面”答案就越优。所以可以顺序枚举起点 s,然后对于每个起点二分枚举终点 t,如果 s 到 t 的顺时针距离大于总距离的一半,那么就往左移一点;否则就往右移一点。这样不断逼近“正对面”就能找到最优解。
初始得分 50 分。由于对于二分枚举的两个边界掐得太紧导致边界没有被枚举到。
物流运输
动态规划+最短路
【问题描述】
物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是—件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小。
【输入】第一行是四个整数n(l≤n≤100)、m(l≤m≤20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来一行是一个整数d,后面的d行每行是三个整数P(1<P<m),a,b(1≤a≤b≤n)。表示编号为P的码头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头A到码头B的运输路线。
【解题过程】
一开始以为是贪心,但是没有找到合适的贪心策略,而且越发感觉贪心不可行。
然后转向搜索,枚举每天走哪条路径,复杂度太高,时间不够也没写完。
初始得分 0 分。
正解是用动态规划,用 g(i, j) 表示从第 i 天到第 j 天一直连通的最短路(spfa),用 f(i) 表示从第一天到第 i 天所需的成本,则
f(i) = min{ f(j)+g(i+1, j)+k, 0<=j<i }
边界 f(0) = -k (为了消去 f(1) 中多余的 k)
01day2的更多相关文章
随机推荐
- 字符串匹配--kmp算法原理整理
kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...
- uva 10859
刘书例题 树形dp #include <cstdio> #include <cstdlib> #include <cmath> #include <map& ...
- OpenLDAP配置信息记录
随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...
- 翻译:用Javascript的Function构造器伪造上下文 by Ben Nadel
在我的jQuery模板标记语言(JTML)项目中,我需要一种方式将JTML模板编译到JS函数,这样它们就可以如期地在任何时候转换成新的HTML标记.但这是一个严峻的问题,因为JTML代码涉及非作用域( ...
- 【设计模式六大原则4】接口隔离原则(Interface Segregation Principle)
定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类 ...
- java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:
总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但 ...
- [Browsable(false)]
1.c#方法上面的[Browsable(false)]是干吗用的? 答案:标明此对象不可被浏览,这样它就不会出现在设计器的属性窗口里了 看如下代码: /// <include file='Asp ...
- http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html(重要)
http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html
- C++ Primer笔记整理
1. 迭代器:迭代器是一种对象,它可以看做是游标,用来遍历标准模板库中的部分或者全部元素. 每个迭代器指向容器中确定的地址,此外,迭代器还提供一些基本操作符:*.++.==.!=.=. 2. 模板:是 ...
- Apache与Tomcat整合
Apache与Tomcat整合 一 Apache与Tomcat比较联系 apache支持静态页,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache ...