uva 10671 - Grid Speed(dp)
题目大意:给出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)的更多相关文章
- HDU 1160 FatMouse's Speed (DP)
FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
- UVA.674 Coin Change (DP 完全背包)
UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...
- uva 10817(数位dp)
uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100).已知每人的工资c(10000 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- 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 ...
- uva 10453 - Make Palindrome(dp)
题目链接:10453 - Make Palindrome 题目大意:给出一个字符串,通过插入字符使得原字符串变成一个回文串,要求插入的字符个数最小,并且输出最后生成的回文串. 解题思路:和uva 10 ...
- UVA 116 Unidirectional TSP(dp + 数塔问题)
Unidirectional TSP Background Problems that require minimum paths through some domain appear in ma ...
- uva 1331 - Minimax Triangulation(dp)
option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...
- 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 ...
随机推荐
- 【IOS实例小计】图像移动--可扩展为动态实现图标变化
预备知识: 1.页面切换: 从一个ViewController切换到另一个ViewController有下面几种方法: (1)self.view addSubview:(加载的新页面); 相 ...
- 腾讯測试project师笔试面试记录
从3月29日參加腾讯笔试開始,開始了为期1周的腾讯之旅,尽管最后还是跪在了二面上,可是感觉收获非常多,至少明确了自己与向往的BAT公司的差距,明确了自己还是路漫漫其修远兮. 腾讯非常注 ...
- 去掉chrome记住密码后自动填充表单的黄色背景
chrome表单自动填充后,input文本框的背景会变成黄色的,通过审查元素可以看到这是由于chrome会默认给自动填充的input表单加上input:-webkit-autofill私有属性,然后对 ...
- 跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块)
跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块) 上面设计好了一个模块的主界面,以下通过菜单命令的运行来把这个模块增加到主界面其中. 在MainModule. ...
- PreparedStatement与Statement
转载自:http://www.importnew.com/5006.html PreparedStatement是用来运行SQL查询语句的API之中的一个,Java提供了 Statement.Prep ...
- python(abi) RPM DEB Download
python(abi) RPM DEB Download python(abi) RPM DEB Download
- C++ 中获取 可变形參函数中的參数
#include <iostream> #include <stdarg.h> using namespace std; int ArgFunc(const char * st ...
- Cocos2d-x教程(28)-ttf 字体库的使用
欢迎增加 Cocos2d-x 交流群: 193411763 转载请注明原文出处:http://blog.csdn.net/u012945598/article/details/37650843 通常为 ...
- windows服务的创建、安装和调试
1.创建 windows服务 项目 文件 -> 新建项目 -> 已安装的模板 -> Visual C# -> windows ,在右侧窗口选择"windows 服 ...
- RequireJS和JQuery的模块化编程
基于RequireJS和JQuery的模块化编程 由于js的代码逻辑越来越重,一个js文件可能会有上千行,十分不利于开发与维护.最近正在把逻辑很重的js拆分成模块,在一顿纠结是使用requirejs还 ...