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;
}