题意:有m辆车,每次最多运n辆过河,过河过去需要t时间回来需要t时间,m辆车一开始并不是都在岸边的,给出m辆车抵达岸边的时间(只有车抵达河岸才能过河),问使得所有车辆过河所需要的最少次数 跟 最早时间
分析:
一开始看题目可能觉得有两个最优解,最少次数跟最早时间,次数最少猜测一下,m%n==0则刚好为m/n次 否则 为m/n+1次,然后考虑最早时间,时间要最早 其实就是最后一辆车最早过河了即可,那么最后一辆车尽早被送走就好,看样子可以贪心
举了几个案例试了一下,若m%n==0则不用说了,每次运n辆车过河即可,这样既保证了次数最少又保证了时间最早
若m%n!=0,那么第一次运m%n辆车,剩下的每次运n辆车即可,所以贪心是可以的
#include
#include
#include
#include
#include
#include
#include
#include
这道题贪心可以,那么深入试了一下,动规也是可以的,
dp[i]表示送走第i辆车的最早时间
num[i]表示送走第i辆车的次数
注意时间的早和晚不能直接取的,因为车子到了你才能运过河,
所以状态转移方程有个去当前dp数组值与当前的time数组值最大值的地方要注意
dp[i] = min(max(dp[j] + t,time[i]) + t),其中j为 i-n 到i
次数转移就简单了直接 num[i] = num[j] + 1,其中j为最小的
#include
#include
#include
#include
#include
#include
#include
#include