SDRIVE - Lái xe

Tác giả: RR

Ngôn ngữ: C++

#include <iomanip>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>

#define FOR(i,a,b) for(int i=(a),_b=(b); i <= _b; ++i)
#define FORD(i,a,b) for(int i=(a),_b=(b); i >= _b; --i)
#define REP(i,a) for(int i=0,_a=(a); i < _a; ++i)
using namespace std;

long double f[10111][22];
int n, m;
int type[10111], s[10111];

#define sqr(x) ((x) * (x))

int main() {
    cout << (fixed) << setprecision(10);
    while (scanf("%d%d", &n, &m) == 2) {
        FOR(i,1,n) scanf("%d", &type[i]);
        FOR(i,1,n) scanf("%d", &s[i]);

        FOR(i,1,n) FOR(j,1,m) f[i][j] = 1e50;
        FOR(j,1,m) f[0][j] = 0;

        FOR(i,0,n-1) FOR(j,1,m) {
            if (type[i+1] == 0) {
                FOR(jj,1,m)
                if (abs(j - jj) * 100 <= s[i+1]) {
                    f[i+1][jj] = min(f[i+1][jj], 
                        f[i][j] + sqrt(sqr((j - jj)*10.0) + sqr(s[i+1])));
                }
            }
            else {
                long double r = s[i+1];
                if (type[i+1] == 1) r += (j - 0.5) * 10.0;
                else r += (m - j + 0.5) * 10;

                f[i+1][j] = min(f[i+1][j], f[i][j] + 3.141592654 * r / 2.0);
            }
        }
        long double res = 1e50;
        FOR(j,1,m) res = min(res, f[n][j]);

        cout << res << endl;
    }
    return 0;
}

Download