Loading [MathJax]/extensions/tex2jax.js

P1594:护卫队题解

思路

一看这道题就知道是划分车辆的DP。一开始想的是F[前i辆车][划分次数j]=前i辆车划分j次的时间,然后发现这种写法很慢,而且在本题中没有说明划分的次数,我们只需要求前n辆车的解即可。

转移方程:F[i] = F[j-1] + L / (lowest_spd in [1,j]),转移条件是不超载的情况下。

这题比较毒瘤,int会被卡,double的无穷大必须要真·无穷大。

代码

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// 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;
}
// 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; }
// 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;
}

Leave a Reply

Your email address will not be published. Required fields are marked *