由于前两题都很简单,就简单写下思路。
1.一个人往下走与一个人往上走碰到之后改变方向,就相当于两人继续往前走。于是我们就可以将箱子平均分配给每个人。多余的箱子分给完成任务最早的人。这样就可以轻松求得答案了。
2.o(nlogn)的算法就是将圆拉成一条直线,并将它倍长。从1到n点往后n个点中进行二分,由此可以得出答案。
o(n)的算法就是从起点开始,有两个标记,一个左标记,一个右标记。在总值小于周长的一半时右标记加加,反之左标记加加。这样做也要将圆拉成直线并倍长。
这道题是好题
第三题是省选题,比较难想
3.首先我们看到题目会发现数据很小,但用深搜又不行,于是就可以想到应该用dp。(本蒟蒻想不出来,是某徐大班长想出来的)然而怎么dp呢?如果一幅图中有一条到达终点的最短路而另一幅图中有不一样的一条最短路(两个障碍不同)。我们将这两幅图合并,障碍全部叠加在第三幅图中得出最终最短路。最终最短路同样可以在第一幅和第二幅图中走。这样我们就可以用区间dp,以天数长度为区间,就可以完美dp。我们提前处理好两两时间之内所有的叠加障碍最短路。在在之后用区间dp。
这里预处理我用的是floyd因为好打,而dp用的是二维的。
dp[i][j]表示从i到j时间中从起点到终点最短路之和。
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+kk)(kk是换路代价)
这里dp[i][j]要提前处理好dp(赋好初值)
优秀算法还有spfa来求最短路
一维数组dp