• HDU 2056 龟兔赛跑 (DP)


    题意:见题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059

    解题报告:以前一直没看出来这题是个DP题,知道是DP题就简单了 。首先要把起点和终点看成是两个充电站,然后假设有两个点i 和 j,判断的就 是假设如果从

    i 充电站充电一次,直到j点,判断这样到j点一共用的时间,取小的,核心的一句代码就是:

    dp[j] = min(dp[j],dp[i] + judge(i,j) + T);

    judge(i,j)这个函数用来你判断 当 在  i 点充电后直到 j 点,这一段路所需要的时间是,然后dp[i] 是冲起点到 i 点所花费的时间,然后T表示在i点充电所

    花费的时间。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 double que[105],T[105];
     8 int n;
     9 double l,c,t,vr,vt[2];
    10 
    11 double judge(int i,int j)
    12 {
    13     if(que[j] - que[i] > c)
    14     return (c / vt[0] + (que[j] - que[i] - c) / vt[1]);
    15     else return (que[j] - que[i]) / vt[0];
    16 }
    17 
    18 int main()
    19 {
    20     while(scanf("%lf",&l)!=EOF)
    21     {
    22         scanf("%d%lf%lf",&n,&c,&t);
    23         scanf("%lf%lf%lf",&vr,&vt[0],&vt[1]);
    24         for(int i = 1;i <= n;++i)
    25         scanf("%lf",&que[i]);
    26         que[0] = T[0] = 0;
    27         n++;
    28         que[n] = l;
    29         for(int i = 0;i <= n;++i)
    30         if(que[i] <= c)
    31         T[i] = que[i] / vt[0];
    32         else T[i] = c / vt[0] + (que[i] - c) / vt[1];
    33         for(int i = 1;i < n;++i)
    34         for(int j = n;j > i;--j)
    35         T[j] = min(T[j],T[i] + judge(i,j) + t);
    36         double t_vr = l / vr;
    37         printf(T[n] < t_vr? "What a pity rabbit!
    ":"Good job,rabbit!
    ");
    38     }
    39     return 0;
    40 }
    View Code
  • 相关阅读:
    OpenFlow 消息
    Revolving Digits
    Tavas and Malekas
    Prefixes and Suffixes
    快速构造后缀自动机
    REBXOR
    BZOJ3689 异或之
    BZOJ3689 异或之
    最长路径异或和
    BZOJ 1355 [Baltic2009] Bazinga
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3534313.html
Copyright © 2020-2023  润新知