POJ - 3846 Mountain Road 动归
题意:n个人要过桥,有的人从左边来,有的人从右边来,给你他们到达桥一端的时间和过桥所需要的时间,要求相向而行的只能有一人,对于每一个点,不能在10s内有同向而行的人经过。
思路:f[i][j][A/B] 表示 从左边走了i个,从右边走了j个,最后一个是左边还是右边的最小时间。问你最后一辆车的到达时间最小是多少。
对于每一个这样的状态,可以往后面一直推过了k辆反向的车所消耗的时间,只要把出发时间和到达时间的间距都压在10s以上就可以满足条件,不断的更新最优值就行了。
我之前写的时候对于每一个状态只知道推相邻的状态,这样导致转移的代码特别冗杂,最终答案也没有对,而且还超时了,所以这题来讲还是很遗憾没写出来,想到了状态,只是转移的时候犯了错误,没能过掉。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LL long long
#define INF 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin)
#define OUT freopen("out.txt", "w", stdout)
#define MAXN 100005
using namespace std;
#define A 0
#define B 1
struct Node{
int x, y, pos;
};
int n;
int f[][][];
Node a[], b[];
int a0, b0;
int main()
{
//IN;
//OUT;
int T;
scanf("%d", &T);
while(T--){
scanf("%d\n", &n);
char ch;
int x, y;
a0 = ;
b0 = ;
//scanf("%c", &ch);
for(int i = ; i <= n; i++){
scanf("%c", &ch);
scanf("%d%d\n", &x, &y); if(ch == 'A'){
a0++;
a[a0].x = x;
a[a0].y = y;
a[a0].pos = i;
}
else{
b0++;
b[b0].x = x;
b[b0].y = y;
b[b0].pos = i;
}
}
int i = , j = ;
memset(f, INF, sizeof(f));
f[][][A] = ;
f[][][B] = ;
int s, t;
for(int i = ; i <= a0; i++){
for(int j = ; j <= b0; j++){
t = f[i][j][A] - ;
s = f[i][j][A] - ;
for(int k = j + ; k <= b0; k++){
s = max(s + , b[k].x);
t = max(t + , s + b[k].y);
f[i][k][B] = min(f[i][k][B], t);
}
t = f[i][j][B] - ;
s = f[i][j][B] - ;
for(int k = i + ; k <= a0; k++){
s = max(s + , a[k].x);
t = max(t + , s + a[k].y);
f[k][j][A] = min(f[k][j][A], t);
}
}
}
printf("%d\n", min(f[a0][b0][A], f[a0][b0][B]));
}
return ;
}
POJ - 3846 Mountain Road 动归的更多相关文章
- Mountain Road
题意: n个车,过一条路,有不同的方向,路上不允许同时有两个方向的车,给出每个车的起始时间,方向,和经过路花费的时间,车最小间隔10个时间,求最后一个车通过路的最早的时间. 分析: dp[i][j][ ...
- POJ 2110 Mountain Walking 二分+bfs
传送门 昨天看到这个题还以为是个脑残的dp, 然而脑残的是我. 题目意思就是从左上角走到右下角, 设x为路径上的最大值-最小值, 求x的最小值. 二分x, 对于每一个x, 枚举下界lower, low ...
- uva 12222 Mountain Road
题意: 有一个单行道,两个方向都有车在等待.给出每个车的方向以及到达的时间以及走完这段路所需要的时间. 为了防止车祸,同向两车通过任一点的时间间隔不得小于10s. 求最后一辆车离开时刻的最小值. 思路 ...
- POJ 1947 Rebuilding Road(树形DP)
Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, n ...
- 【POJ 3352】 Road Construction
[题目链接] 点击打开链接 [算法] tarjan算法求边双联通分量 [代码] #include <algorithm> #include <bitset> #include ...
- {POJ}{动态规划}{题目列表}
动态规划与贪心相关: {HDU}{4739}{Zhuge Liang's Mines}{压缩DP} 题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形 思路:背包问题,求出所有的正方形 ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- XML Data Type Methods(一)
XML Data Type Methods(一) /*XML Data Type Methods: 1.The query('XQuery') method retrieves(vt.检索,重新得到) ...
- gRPC 的route_guide例子
本文的例子代码在: https://github.com/grpc/grpc-go/tree/master/examples/route_guide 功能就类似目前LBS一样,在每个位置上报一些文 ...
随机推荐
- Linux bash常用快捷键
移动光标 ctrl-a 光标移动到行首 ctrl-e 光标移动到行尾 ctrl+xx 在行首和光标位置直接切换 ctrl-b 光标左移一位 ctrl-f 光标右移一位 alt-b 光标左移一词 alt ...
- python中的try...except...finally函数
异常Error 我们在写代码的时候,经常会遇见程序抛出Error无法执行的情况 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Python脚本发 ...
- Redit集群搭建-Sentinel模式搭建
Redit集群搭建 学习了: Windows:http://blog.csdn.net/mrxiagc/article/details/52799081 Linux:https://www.cnblo ...
- poj 2337 Catenyms 【欧拉路径】
题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...
- taglist安装
注意:taglist依赖于ctags,所以要先装ctags,否则taglist装了也没法用!1.首先安装ctags1)ubuntu安装sudo apt-get install exuberant-ct ...
- [COI2007] [luogu P1823] Patrik 音乐会的等待 解题报告 (单调栈)
题目链接:https://www.luogu.org/problemnew/show/P1823 题目: N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人. ...
- 浅谈贝塞尔曲线以及iOS中粘性动画的实现
关于贝塞尔曲线,网上相关的文章很多,这里我主要想用更简单的方法让大家理解贝塞尔曲线,当然,这仅仅是我个人的理解,如有错误的地方还请大家能够帮忙指出来,这样大家才能一起进步. 贝塞尔曲线,常用到的可分为 ...
- SQL_触发器学习
--触发器学习-------------------------------------------------------------------------------after 触发器----- ...
- Mac配置PHP环境
本文章来自:http://blog.csdn.net/wj_november/article/details/51417491 本人使用的是:MacOs 10.12.3,根据如上操作已经安装成功,感谢 ...
- [POI2008]POD-Subdivision of Kingdom(搜索+状压)
题意 给定一个n个点的无向图,要求将点集分成大小相等的两个子集,使两个子集之间的边数最少 (n<=26) 题解 一开始想了半天DP发现不会,去看题解全是搜索. 所以发现C(1326)可以过我就写 ...