HD2059龟兔赛跑(DP)
题目链接
直接拿来当贪心做了=_=,然后就懵逼了
动态规划,本弱真没想到=_=
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const double eps = 0.000001; 7 const int INF = 0xffffff; 8 int station[110]; 9 double dp[110]; 10 int l, n, c, t, vr, vt1, vt2; 11 double get_time(int s, int tempc) 12 { 13 double gtime = 0; 14 if(s > tempc) 15 { 16 gtime += 1.0 * tempc / vt1; 17 gtime += (s - tempc) * 1.0 / vt2; 18 } 19 else 20 { 21 gtime += s * 1.0 / vt1; 22 } 23 return gtime; 24 } 25 int is_chong(int s, int tempc) 26 { 27 double chong_time = t + get_time(s, c); 28 double not_chong_time = get_time(s, tempc); 29 if(not_chong_time - chong_time > eps) 30 return 1; 31 return 0; 32 } 33 double get_min(double x, double y) 34 { 35 if(x - y > eps) 36 return y; 37 return x; 38 } 39 int main() 40 { 41 while(scanf("%d", &l) != EOF) 42 { 43 scanf("%d%d%d", &n, &c, &t); 44 scanf("%d%d%d", &vr, &vt1, &vt2); 45 for(int i = 1; i <= n; i++) 46 scanf("%d", &station[i]); 47 station[n + 1] = l; 48 double rtime = 1.0 * l / vr; 49 station[0] = 0; 50 dp[0] = 0; 51 for(int i = 1; i <= n + 1; i++) 52 { 53 dp[i] = INF; 54 for(int j = i - 1; j >= 0; j--) 55 { 56 double tempTime = 0; 57 int s = station[i] - station[j]; 58 if(s > c) 59 { 60 tempTime = 1.0 * c / vt1; 61 tempTime += (s - c) * 1.0 / vt2; 62 } 63 else 64 tempTime = s * 1.0 / vt1; 65 if(j) 66 tempTime += t; 67 dp[i] = get_min(dp[i], dp[j] + tempTime); 68 } 69 /* 70 int s = station[i] - station[i - 1]; 71 if(s > tempc) 72 { 73 gtime += 1.0 * tempc / vt1; 74 gtime += (s - tempc) * 1.0 / vt2; 75 tempc = 0; 76 } 77 else 78 { 79 gtime += s * 1.0 / vt1; // 不知道什么时候手贱,这里把s写成了c,浪费了半个小时 80 tempc = tempc - s; 81 } 82 if(is_chong(station[i + 1] - station[i], tempc)) 83 { 84 gtime += t; 85 tempc = c; 86 } 87 */ 88 } 89 //gtime += get_time(l - station[n], tempc); 90 if(dp[n + 1] - rtime > eps) 91 printf("Good job,rabbit!\n"); 92 else 93 printf("What a pity rabbit!\n"); 94 } 95 return 0; 96 }