题目链接:uva 10671 - Grid
Speed

题目大意:给出N,表示在一个N*N的网格中,每段路长L,如今给出h,v的限制速度,以及起始位置sx,sy,终止位置ex,ey,时间范围st,et,车仅仅走最短路,问说在范围内最快到达和耗油量最小的情况下时间和耗油量。

解题思路:dp[x][y][t]表示在x,y这一点,时间为t的耗油量最小为dp[x][y][t],vis[x][y][t]表示该情况是否可达。dx,dy表示由起点向终点移动的方向。由于时间为L∗60v,
由于v是5的倍数,而且小于50.通过约分能够得知,底数有可能剩余2,3,5,7.为了保证时间为整数,所以我们乘上210.可是由于L中可能包括这些因子,所以仅仅要扩大Lgcd(L,210)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std;
const int maxn = 15;
const int maxt = 210005;
const double INF = 0x3f3f3f3f3f3f3f;
const double eps = 1e-9; int h[maxn], v[maxn], vis[maxn][maxn][maxt];
double dp[maxn][maxn][maxt], mintval, minv;
int n, m, mint, minvtime; int N, L, sx, sy, ex, ey, st, et, dx, dy; int gcd (int a, int b) {
return b == 0 ? a : gcd(b, a%b);
} void init () {
scanf("%d%d", &N, &L);
for (int i = 1; i <= N; i++)
scanf("%d", &h[i]);
for (int i = 1; i <= N; i++)
scanf("%d", &v[i]);
scanf("%d%d%d%d%d%d", &sx, &sy, &ex, &ey, &st, &et); m = 210 / gcd(L, 210); st *= m;
et *= m;
dx = (sx > ex ? -1 : 1);
dy = (sy > ey ? -1 : 1);
} inline double cal (int x) {
return ((double)L / (80 - 0.03 * x * x));
} void move (int x, int y, int t) {
int p = x + dx;
int q = y + dy;
//printf("%d %d %d %lf\n", x, y, t, dp[x][y][t]); if (p > 0 && p <= N) {
for (int i = 5; i <= h[y]; i += 5) {
int ti = t + m * L * 60 / i;
if (ti > et)
continue; if (vis[p][y][ti])
dp[p][y][ti] = min(dp[p][y][ti], dp[x][y][t] + cal(i));
else {
dp[p][y][ti] = dp[x][y][t] + cal(i);
vis[p][y][ti] = 1;
}
}
} if (q > 0 && q <= N) {
for (int i = 5; i <= v[x]; i += 5) {
int ti = t + m * L * 60 / i;
if (ti > et)
continue; if (vis[x][q][ti])
dp[x][q][ti] = min(dp[x][q][ti], dp[x][y][t] + cal(i));
else {
dp[x][q][ti] = dp[x][y][t] + cal(i);
vis[x][q][ti] = 1;
}
}
}
} void solve () {
memset(vis, 0, sizeof(vis));
dp[sx][sy][0] = 0;
vis[sx][sy][0] = 1; for (int i = sx; i != ex + dx; i += dx) {
for (int j = sy; j != ey + dy; j += dy) {
for (int t = 0; t < et; t++) {
if (vis[i][j][t])
move(i, j, t);
}
}
} mint = -1;
minv = INF;
for (int t = st; t <= et; t++) {
if (vis[ex][ey][t]) {
//printf("%d %lf\n", (int)((double)t / n + 1 - eps), dp[ex][ey][t]);
if (mint == -1) {
mint = (int)((double)t / m + 1 - eps);
mintval = dp[ex][ey][t];
} if (dp[ex][ey][t] < minv) {
minv = dp[ex][ey][t];
minvtime = (int)((double)t / m + 1 - eps);
}
}
}
} int main () {
int cas;
scanf("%d", &cas);
for (int i = 1; i <= cas; i++) {
init();
solve();
printf("Scenario %d:\n", i);
if (mint == -1)
printf("IMPOSSIBLE\n");
else {
printf("The earliest arrival: %d minutes, fuel %.2lf gallons\n", mint, mintval );
printf("The economical travel: %d minutes, fuel %.2lf gallons\n", minvtime, minv);
}
}
return 0;
}

uva 10671 - Grid Speed(dp)的更多相关文章

  1. HDU 1160 FatMouse's Speed (DP)

    FatMouse's Speed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Su ...

  2. UVA.674 Coin Change (DP 完全背包)

    UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...

  3. uva 10817(数位dp)

    uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100).已知每人的工资c(10000 ...

  4. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  5. Robots on a grid(DP+bfs())

    链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=25585 Current Server Time: 2013-08-27 20:42:26 Ro ...

  6. uva 10453 - Make Palindrome(dp)

    题目链接:10453 - Make Palindrome 题目大意:给出一个字符串,通过插入字符使得原字符串变成一个回文串,要求插入的字符个数最小,并且输出最后生成的回文串. 解题思路:和uva 10 ...

  7. UVA 116 Unidirectional TSP(dp + 数塔问题)

     Unidirectional TSP  Background Problems that require minimum paths through some domain appear in ma ...

  8. uva 1331 - Minimax Triangulation(dp)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...

  9. UVa 11825 - Hackers' Crackdown DP, 枚举子集substa = (substa - 1)&sta 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

随机推荐

  1. [C++]C++中的运行时类型检测

    Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...

  2. Mysql 导入导出数据结构及数据

    方式一: mysqldump -ukevin -P3306 --default-character-set=utf8 -p -h10.1.15.123 activity sign_in_user &g ...

  3. Python编程中常用的12种基础知识总结

    原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...

  4. 伤不起的戴尔台式机XPS8700脆弱的蓝牙

    http://en.community.dell.com/support-forums/desktop/f/3514/t/19520747.aspx 1.报价仅仅包含主机,并且不带音响(speaker ...

  5. NYOJ 12 喷水装置(二)

    pid=12">喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n( ...

  6. 事务的使用示例及WinForm实现中的若干问题

    --事务的使用示例 create database MyDB go use MyDB create table account ( Id int identity primary key, balan ...

  7. 重构后的ConditionHelper

    两三个月前曾写过<重构ConditionHelper>的随笔,但不知是因为写得不够好还是没有什么新意,我发表至博客园首页时被屏蔽了,本着好的知识应该分享给更多人,加之新项目已交付用户使用所 ...

  8. HDU3977(斐波那契数列模n的循环节长度)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...

  9. 利用SVNKit进行版本库的树的导出

    public List searchByTree(String userName,String passwd,String SVNServerUrl,String dirUrl){ //这里有点像 s ...

  10. zend studio 10 实现代码自动换行

    在一篇zend framework 的PHP编码标准的文章中看到了这么一段: 一行 80 字符以内是比较合适,就是说,ZF 的开发者应当努力在可能的情况下保持每行代码少于 80 个字符,在有些情况下, ...