博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2059龟兔赛跑("01"背包)
阅读量:5102 次
发布时间:2019-06-13

本文共 2196 字,大约阅读时间需要 7 分钟。

 

题解:

  看到这个题,第一反应就是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
2 #include
3 #include
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!\n");31 else32 printf("What a pity rabbit!\n");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

 

转载于:https://www.cnblogs.com/violet-acmer/p/9881388.html

你可能感兴趣的文章
Hash和Bloom Filter
查看>>
SQL Server获取月度列表
查看>>
python常用函数
查看>>
python 描点画圆
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
pycharm 如何设置方法调用字体颜色
查看>>
VUE源码解析心得
查看>>
餐馆王第一天
查看>>
python 科学计数法转数值
查看>>
爱的十个秘密--8.沟通的力量
查看>>
mysql 自动加上编号
查看>>
Message no. C6015--No valuation variant found for valuation area xxxx
查看>>
Program Variant Scheduling job
查看>>
.net之路
查看>>
题目2-括号配对问题
查看>>
python 面向对象oop
查看>>
linux 安装 Django
查看>>
Heap:Sunscreen(POJ 3614)
查看>>
Storm-源码分析-Streaming Grouping (backtype.storm.daemon.executor)
查看>>