首页 > 代码库 > 01day2
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