Editorial for Lái xe
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
#include <iostream> #include <algorithm> #include <cmath> #define sqr(x) ((x)*(x)) using namespace std; const double PI = 3.141592654; int n, m, len[10010], type[10010]; double f[10010][22]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> type[i]; for (int i = 1; i <= n; i++) cin >> len[i]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { f[i][j] = 1e18; if (!type[i]) { for (int jj = 1; jj <= m; jj++) if (abs(j - jj) * 100 <= len[i]) f[i][j] = min(f[i][j], f[i - 1][jj] + sqrt(sqr(len[i]) + sqr((j - jj) * 10))); } else { double radius = len[i] + 5; if (type[i] == 1) radius += 10 * (j - 1); else radius += 10 * (m - j); f[i][j] = f[i - 1][j] + radius * PI * 0.5; } } double ans = 1e18; for (int j = 1; j <= m; j++) ans = min(ans, f[n][j]); printf("%.2lf\n", ans); }
Code mẫu của happyboy99x
#include <algorithm> #include <bitset> #include <cctype> #include <cfloat> #include <climits> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iostream> #include <list> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <string> #include <utility> #include <vector> using namespace std; typedef pair<int, int> ii; typedef vector<ii> vii; typedef vector<vii> vvii; typedef vector<int> vi; typedef vector<vi> vvi; #define sz(a) int((a).size()) #define fi first #define se second #define pb push_back #define mp make_pair #define all(c) (c).begin(), (c).end() #define tr(c,i) for(typeof((c).begin()) i = (c).begin(), _e = (c).end(); i != _e; ++i) #define present(c,x) ((c).find(x) != (c).end()) #define cpresent(c,x) (find(all(c),x) != (c).end()) #define rep(i,n) for(int i = 0, _n = (n); i < _n; ++i) #define repd(i,n) for(int i = (n)-1; i >= 0; --i ) #define fo(i,a,b) for(int i = (a), _b = (b); i <= _b; ++i) #define fod(i,a,b) for(int i = (a), _b = (b); i >= _b; --i) #define INF 1000000000 #define N 10005 #define M 25 #define sqr(x) ((x)*(x)) int l[N], n, m; double f[N][M], s[N]; int main() { #ifndef ONLINE_JUDGE freopen( "input.txt", "r", stdin ); freopen( "output.txt", "w", stdout ); #endif scanf("%d%d",&n,&m); fo(i,1,n) scanf("%d",l+i); fo(i,1,n) scanf("%lf",s+i); fo(i,1,n) fo(j,1,m) switch(l[i]){ case 2: f[i][j] = f[i-1][j] + (10*j-5+s[i])*M_PI/2; break; case 1: f[i][j] = f[i-1][j] + (10*(m-j)+5+s[i])*M_PI/2; break; default: f[i][j] = DBL_MAX; fo(k,max(1,j-(int)(s[i]/100)),min(m,j+(int)(s[i]/100))) f[i][j] = min(f[i][j],f[i-1][k]+sqrt(sqr(s[i])+100*sqr(j-k))); } double res = DBL_MAX; fo(i,1,m) res = min(res, f[n][i]); printf("%.2lf\n", res); return 0; }
Code mẫu của ladpro98
#include <bits/stdc++.h> #define REP(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i) const double INF = 1e9; const double PI = 3.141592654; const int N = 10101; const int M = 22; using namespace std; void minimize(double &a, double b) { a = a > b ? b : a; } double getLengthLine(int a, int b) { return sqrt(a * a + b * b); } double getLengthCurve(int radius) { return PI * radius / 2; } int n, m; int type[N], s[N]; double dp[2][M]; int main() { ios::sync_with_stdio(0); cin.tie(0); #ifdef _LAD_ freopen("SDRIVE.in", "r", stdin); #endif // _LAD_ cin >> n >> m; REP(i, 1, n) cin >> type[i]; REP(i, 1, n) cin >> s[i]; int now = 0, nxt = 1; REP(i, 1, n) { REP(j, 1, m) dp[nxt][j] = INF; REP(j, 1, m) { if (type[i] == 0) { int range = s[i] / 100; REP(k, max(1, j - range), min(m, j + range)) minimize(dp[nxt][k], dp[now][j] + getLengthLine(s[i], abs(j - k) * 10)); } else if (type[i] == 1) { minimize(dp[nxt][j], dp[now][j] + getLengthCurve(s[i] + (j - 1) * 10 + 5)); } else { minimize(dp[nxt][j], dp[now][j] + getLengthCurve(s[i] + (m - j) * 10 + 5)); } } now ^= 1; nxt ^= 1; } double ans = INF; REP(i, 1, m) minimize(ans, dp[now][i]); cout << setprecision(2) << fixed << ans << endl; return 0; }
Code mẫu của RR
#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; }
Code mẫu của hieult
#include <set> #include <map> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <sstream> #include <iomanip> #include <iostream> #include <algorithm> #include <ctime> #include <deque> #include <bitset> #include <cctype> #include <utility> #include <cassert> using namespace std; typedef long long ll; typedef long double ld; typedef unsigned int ui; typedef unsigned long long ull; #define Rep(i,n) for(int i = 0; i < (n); ++i) #define Repd(i,n) for(int i = (n)-1; i >= 0; --i) #define For(i,a,b) for(int i = (a); i <= (b); ++i) #define Ford(i,a,b) for(int i = (a); i >= (b); --i) #define Fit(i,v) for(__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++i) //#define Fitd(i,v) for(__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++i) #define mp make_pair #define pb push_back #define fi first #define se second #define sz(a) ((int)(a).size()) #define all(a) (a).begin(), (a).end() #define ms(a,x) memset(a, x, sizeof(a)) template<class F, class T> T convert(F a, int p = -1) { stringstream ss; if (p >= 0) ss << fixed << setprecision(p); ss << a; T r; ss >> r; return r; } template<class T> T gcd(T a, T b) { T r; while (b != 0) { r = a % b; a = b; b = r; } return a; } template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; } template<class T> T sqr(T x) { return x * x; } template<class T> T cube(T x) { return x * x * x; } template<class T> int getbit(T s, int i) { return (s >> i) & 1; } template<class T> T onbit(T s, int i) { return s | (T(1) << i); } template<class T> T offbit(T s, int i) { return s & (~(T(1) << i)); } template<class T> int cntbit(T s) { return s == 0 ? 0 : cntbit(s >> 1) + (s & 1); } const int bfsz = 1 << 16; char bf[bfsz + 5]; int rsz = 0; int ptr = 0; char gc() { if (rsz <= 0) { ptr = 0; rsz = (int) fread(bf, 1, bfsz, stdin); if (rsz <= 0) return EOF; } --rsz; return bf[ptr++]; } void ga(char &c) { c = EOF; while (!isalpha(c)) c = gc(); } int gs(char s[]) { int l = 0; char c = gc(); while (isspace(c)) c = gc(); while (c != EOF && !isspace(c)) { s[l++] = c; c = gc(); } s[l] = '\0'; return l; } template<class T> bool gi(T &v) { v = 0; char c = gc(); while (c != EOF && c != '-' && !isdigit(c)) c = gc(); if (c == EOF) return false; bool neg = c == '-'; if (neg) c = gc(); while (isdigit(c)) { v = v * 10 + c - '0'; c = gc(); } if (neg) v = -v; return true; } typedef pair<int, int> II; const ld PI = acos(-1.0); const ld eps = 1e-9; const int dr[] = {+1, +0, +0, -1}; const int dc[] = {+0, +1, -1, +0}; const int inf = (int)1e9 + 5; const ll linf = (ll)1e16 + 5; //const ll mod = (ll)1e9 + 7; #define maxn 20005 int n, m, id[maxn]; ld f[maxn][22], d[maxn]; int main(){ // freopen("in.txt", "r", stdin); cin >> n >> m; For(i, 1, n) cin >> id[i]; For(i, 1, n) cin >> d[i]; For(i, 1, n) For(j, 1, m) f[i][j] = linf; For(i, 1, m) f[0][i] = 0; For(i, 1, n){ if(id[i] == 2){ For(j, 1, m){ ld r = d[i] + 5.0 * (j + j - 1); f[i][j] = f[i - 1][j] + r * PI / 2; } } else if(id[i] == 1){ For(j, 1, m){ ld r = d[i] + 5.0 * (m + m - j - j + 1); f[i][j] = f[i - 1][j] + r * PI / 2; } } else{ int num = (int)((d[i] + 0.5) / 100); For(j, 1, m){ For(k, max(1, j - num), min(m, j + num)){ ld r = 10.0 * abs(j - k); ld dis = sqrt(r * r + d[i] * d[i]); f[i][k] = min(f[i][k], f[i - 1][j] + dis); } } } } ld res = linf; For(i, 1, m) res = min(res, f[n][i]); cout << fixed << setprecision(2) << res; }
Code mẫu của skyvn97
#include<stdio.h> #include<math.h> #define PI acos(-1.0) #define INF 1e9 double f[10101][22]; int s[10101]; int l[10101]; int n,m; void init(void) { int i; scanf("%d",&n); scanf("%d",&m); for (i=1;i<=n;i=i+1) scanf("%d",&l[i]); for (i=1;i<=n;i=i+1) scanf("%d",&s[i]); } int abs(int x) { if (x<0) return (-x); else return (x); } double min(double a,double b) { if (a<b) return (a); else return (b); } void optimize(void) { int i,j,k; for (i=1;i<=m;i=i+1) f[0][i]=0; for (i=1;i<=n;i=i+1) for (j=1;j<=m;j=j+1) { if (l[i]==0) { f[i][j]=INF; for (k=1;k<=m;k=k+1) if (abs(j-k)*100<=s[i]) f[i][j]=min(f[i][j],f[i-1][k]+hypot((j-k)*10,s[i])); } if (l[i]==1) f[i][j]=f[i-1][j]+PI*(s[i]+j*10-5)/2; if (l[i]==2) f[i][j]=f[i-1][j]+PI*(s[i]+5+10*m-10*j)/2; } double r=INF; for (i=1;i<=m;i=i+1) if (f[n][i]<r) r=f[n][i]; printf("%.2lf",r); } int main(void) { init(); optimize(); }
Comments