思路
一看这道题就知道是划分车辆的DP。一开始想的是F[前i辆车][划分次数j]=前i辆车划分j次的时间,然后发现这种写法很慢,而且在本题中没有说明划分的次数,我们只需要求前n辆车的解即可。
转移方程:F[i] = F[j-1] + L / (lowest_spd in [1,j]),转移条件是不超载的情况下。
这题比较毒瘤,int会被卡,double的无穷大必须要真·无穷大。
代码
// P1594.cpp
#include <iostream>
#include <iomanip>
using namespace std;
#define ll long long
const double INF = 9223372036854775807ll;
const ll maxn = 1100;
struct car
{
double v, w;
} cars[maxn];
double W, L, N;
double F[maxn];
void DP()
{
F[0] = 0;
for (ll i = 1; i <= N; i++)
{
F[i] = (double)INF;
double load = 0;
double lspd = INF;
for (ll j = i; j > 0; j--)
{
load += cars[j].w;
if (load > W)
break;
lspd = min(lspd, cars[j].v);
F[i] = min(F[i], F[j - 1] + L / lspd);
}
}
}
int main()
{
cin >> W >> L >> N;
for (ll i = 1; i <= N; i++)
cin >> cars[i].w >> cars[i].v;
DP();
cout << fixed << setprecision(1) << F[(ll)N] * 60;
return 0;
}