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 ...
随机推荐
- Socket编程之聊天程序 - 模拟Fins/ModBus协议通信过程
设备控制软件编程涉及到的基本通信方式主要有TCP/IP与串口,用到的数据通信协议有Fins与ModBus. 更高级别的通信如.net中的Remoting与WCF在进行C/S架构软件开发时会采用. 本篇 ...
- 执行Asp.net应用程序在Linux上的3种托管方式
执行Asp.net应用程序在Linux上的3种托管方式 想要执行Asp.net应用程序在Linux上.我们有3种选择: 1.使用Apache作为Webserver.使用mod_mono:http:// ...
- SetCapture ReleaseCapture
函数功能:该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕获鼠标.假设鼠标光标在还有一个线程创建的窗体 ...
- 介绍一个C++奇巧淫技
你能实现这样一个函数吗: MyType type; HisType htype; serialize_3(11, type, htype); serialize_4(type, hty ...
- Android ARM汇编语言
简介 ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集. 原生程序与ARM汇编语 ...
- Android实战简易教程-第九枪(BitmapFactory.Options对资源图片进行缩放)
我们知道,我们编写的应用程序都是有一定内存限制的.程序占用了过高的内存就easy出现OOM(OutOfMemory)异常.因此在展示高分辨率图片的时候,最好先将图片进行压缩,压缩后的图片大小应该和用来 ...
- 给一个非常长的字符串str 另一个字符集比方{a,b,c} 找出str 里包括{a,b,c}的最短子串。要求O(n)
给一个非常长的字符串str 另一个字符集比方{a,b,c} 找出str 里包括{a,b,c}的最短子串.要求O(n). 比方,字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc. 设置 ...
- Python 类继承,__bases__, __mro__, super
Python是面向对象的编程语言,也支持类继承. >>> class Base: ... pass ... >>> class Derived(Base): ... ...
- zoj3201(树形dp)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3201 题意:给一棵树, n结点<=1000, 和K < ...
- MVAPI第一个版本架构图
MVAPI采用矢量与栅格结合的方式进行移动地图的显示. 进过几个月,目前终于可以完成基本的地图显示及操作功能.还有待实现的是各种性能及效果优化.3D地物等. 发一个1.0的架构图留存一下.(虽然目前还 ...