HDOJ2059简化记录条件找出问题本质DP
2015-06-03 16:03
302 查看
<pre name="code" class="cpp">//龟兔赛跑问题提取信息:加油站位置,当前加油站处的油量,到达此地的最短时间 //到达每一个事件点的时候查看上一个事件点充或者没充电到达该点的最短时间但是电量记录就会 //会繁琐,那么有什么办法可以避免这个问题呢 //后来发现其实根本不用管还剩下多少电量,只用看最后一次加油的位置是哪就行了 //46MS 1620K #include <iostream> using namespace std; #define MAX_N 110 static double L; static int N; static double C,T; static double VR,VR1,VR2; static double stop[MAX_N];//加油站 static double dp[MAX_N]; static double t1; static void DP() { for (int i=0;i<=N+1;++i) dp[i] = 0x3f3f3f3f; dp[0] = 0;//开始处不用加油 if (stop[1]>=C) dp[1] = C/VR1 + (stop[1]-C)/VR2; else dp[1] = stop[1]/VR1; for (int i=2;i<=N+1;++i) { //寻找上一次加油的地点 for (int j=i-1;j>=0;j--)//最后一次加油的地方 { double len = stop[i] - stop[j]; double tn = 0; if (len>=C) tn = C/VR1 + (len-C)/VR2 + T; else tn = len/VR1 + T; if (j==0) dp[i] = min(dp[i],dp[j]+tn-T); else dp[i] = min(dp[i],dp[j]+tn); } } if (dp[N+1]<t1) printf("What a pity rabbit!\n"); else printf("Good job,rabbit!\n"); } int main() { while(~scanf("%lf",&L)) { scanf("%d %lf %lf",&N,&C,&T); scanf("%lf %lf %lf",&VR,&VR1,&VR2); t1 = L/VR; for (int i=1;i<=N;++i) { scanf("%lf",&stop[i]); } stop[N+1] = L; DP(); } return 0; }
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#实现打造气泡屏幕保护效果
- C/C++数据对齐详细解析
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- C字符串操作函数实现方法小结
- C/C++ 宏详细解析
- C/C++实现对STORM运行信息查看及控制的方法
- 用C#生成不重复的随机数的代码
- Javascript SHA-1:Secure Hash Algorithm
- 在c和c++中实现函数回调
- 浅析C/C++中被人误解的SIZEOF
- C 语言基础教程(我的C之旅开始了)[六]
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- C/C++实现的游戏角色名称名字随机生成代码
- C/C++函数调用的几种方式总结
- c/c++中变量的声明和定义深入解析