zoukankan      html  css  js  c++  java
  • hdu 2059龟兔赛跑("01"背包)

    传送门

    https://www.cnblogs.com/violet-acmer/p/9852294.html

    题解:

      看到这个题,第一反应就是DP,因为对于每个充电站,都有两种选择,充电或不充电,和"01"背包问题很想。

      1.首先对问题进行分析是否可用动态规划

        (1)是否满足最优子结构性质

          此问题求的是乌龟是否可以赢兔子,可以转化为求乌龟跑完全程所需的时间问题,而问题的最优解为跑完全程所需的最少时间,如果求出跑完全称所需时间的最优解,

        那么其包含的子问题“跑完某一段路程所需时间”也是最优解。

        (2)是否满足无后效性性质

          设dp[ i ]表示从起点跑到第 i 个充电站所需的最少时间,而状态dp[ 1,......i-1 ],一旦确定,则在求解dp[ i ]的时候,之和之前状态的最优解的值有关,和之前是采取哪种

        手段演变到dp[ 1,.......,i-1] 状态,没有关系。

      2.当满足以上两个性质的时候,表明此题可用DP做,具体步骤如下

        相关变量解释:

          dp[maxn]..............................如前所属,dp[ i ]表示从起点跑到第 i 个充电站所需的最少时间,先确定的dp[1]的最优解,因为在起点处无充电站,所以直接求出即可。

          dist[maxn]............................dist[i] : 第 i 个点距起点的距离

        一共有 N 个充电站,在算上起点和中点,所以说一共有 N+2个点,所以dist[0]=0,dist[1,.....N]分别为第 i 个充电站距起点的距离,dist[N+1]=L

        for i : 2 to N+1

          初始化dp[ i ]=dp[i]=(dist[i] <= C ? 1.0*dist[i]/VT1:1.0*C/VT1+1.0*(dist[i]-C)/VT2);//意思是从起点一路狂奔到 i 点,中间遇到充电站也不充电所需要的时间

          for j : 1 to i-1

            判断能否更新dp[ i ]

              dp[i]=min(dp[i],dp[j]+T+(d <= C ? 1.0*d/VT1:1.0*C/VT1+1.0*(d-C)/VT2));// d : 点 i 距点 j 的距离,判断在 j 点充电与不充电那个更能更快的到达 i 点

    AC代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 #define INF 0x3f3f3f3f
     6 #define mem(a,b) memset(a,b,sizeof(a))
     7 #define esp 1e-6
     8 const int maxn=100+50;
     9 
    10 int L;
    11 int N,C,T;
    12 int VR;
    13 int VT1,VT2;
    14 double dp[maxn];
    15 int dist[maxn];
    16 
    17 void Solve()
    18 {
    19     dp[1]=(dist[1] <= C ? 1.0*dist[1]/VT1:1.0*C/VT1+1.0*(dist[1]-C)/VT2);
    20     for(int i=2;i <= N+1;++i)
    21     {
    22         dp[i]=(dist[i] <= C ? 1.0*dist[i]/VT1:1.0*C/VT1+1.0*(dist[i]-C)/VT2);
    23         for(int j=1;j < i;++j)
    24         {
    25             int d=dist[i]-dist[j];
    26             dp[i]=min(dp[i],dp[j]+T+(d <= C ? 1.0*d/VT1:1.0*C/VT1+1.0*(d-C)/VT2));
    27         }
    28     }
    29     if(dp[N+1]-1.0*L/VR > esp)
    30         printf("Good job,rabbit!
    ");
    31     else
    32         printf("What a pity rabbit!
    ");
    33 }
    34 int main()
    35 {
    36     while(~scanf("%d",&L))
    37     {
    38         scanf("%d%d%d",&N,&C,&T);
    39         scanf("%d%d%d",&VR,&VT1,&VT2);
    40         for(int i=1;i <= N;++i)
    41             scanf("%d",dist+i);
    42         dist[0]=0,dist[N+1]=L;
    43         Solve();
    44     }
    45 }
    View Code
  • 相关阅读:
    使用匿名内部类和lamda的方式创建线程
    匿名内部类与lamda表达式
    机器学习中数据量多少与模型过拟合欠拟合之间的关系
    设计模式和java实现
    八大排序算法汇总——java实现
    java多线程并发编程中的锁
    java NIO
    网络通信引擎ICE的使用
    机器学习算法汇总大梳理
    处理样本不均衡数据
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/9881388.html
Copyright © 2011-2022 走看看