SOJ 3711 Mountain Road
2015-11-06 15:40
344 查看
SOJ3711
题意:这件题意的有点坑。有一条单向道,依次有车到达路的两边,同一方向的车经过同一个地点的时间间隔不能少于10s,不同方向的车,必须等到道路没车才能通过。并且同一个方向的车不能改变车的顺序。之所以说题意有点坑是因为题目中有这样一句话”provided it is not slowed down by other cars in front“,如果把这句话理解为每辆车只能匀速通过会出现问题。见下面分析。
分析:见第二个样例,
>
输入:
4
A 0 100
B 50 100
A 100 1
A 170 100
输出:
270
如果每辆车都只能匀速通过的话,可以发现,270s无论什么方案都是不能得到的,这里的270s应该是这样得到的,先过第二辆车,这个时候,第二辆车走完的时刻是150s,再通过第一辆,此时出发时间是150s,到达时间是250s,再通过第三辆,可以发现,如果必须是匀速,因为连续的两辆车通过同一个地点的间隔不能小于10s,所以他必须在前面一辆到达的250s之后的10s 260s到达,如果按照匀速这个假设,它只能在时刻259s的时候出发,所以下一辆只能在269s的时刻出发了。如果没有匀速的限制条件,第三辆车载160s的时刻出发,可以在260s的时候到达,第四俩车在170s的时刻出发,刚好就在270s的时刻到达了,也就是样例所示。
现在可以考虑定理dp[i][j][A/B]为当通过前i辆A方向的车,和j辆B方向的车,最后一辆车的方向是A/B的时候最短时间。如果这道题的题意是每辆车只能是匀速,那么dp[i][j][A/B]的时间可以从dp[i-1][j][A/B]转移而来,但是这里因为不是匀速直接这样转移会出问题。所以可以这样来跟新,对于每一个i,j都当成是一个间断点,也就是刚好车辆”反向”的点,然后去更新后面都是顺序通过的点,这样就能保证最后一定是最优的结果。如果还是不能理解,参考代码吧。
题意:这件题意的有点坑。有一条单向道,依次有车到达路的两边,同一方向的车经过同一个地点的时间间隔不能少于10s,不同方向的车,必须等到道路没车才能通过。并且同一个方向的车不能改变车的顺序。之所以说题意有点坑是因为题目中有这样一句话”provided it is not slowed down by other cars in front“,如果把这句话理解为每辆车只能匀速通过会出现问题。见下面分析。
分析:见第二个样例,
>
输入:
4
A 0 100
B 50 100
A 100 1
A 170 100
输出:
270
如果每辆车都只能匀速通过的话,可以发现,270s无论什么方案都是不能得到的,这里的270s应该是这样得到的,先过第二辆车,这个时候,第二辆车走完的时刻是150s,再通过第一辆,此时出发时间是150s,到达时间是250s,再通过第三辆,可以发现,如果必须是匀速,因为连续的两辆车通过同一个地点的间隔不能小于10s,所以他必须在前面一辆到达的250s之后的10s 260s到达,如果按照匀速这个假设,它只能在时刻259s的时候出发,所以下一辆只能在269s的时刻出发了。如果没有匀速的限制条件,第三辆车载160s的时刻出发,可以在260s的时候到达,第四俩车在170s的时刻出发,刚好就在270s的时刻到达了,也就是样例所示。
现在可以考虑定理dp[i][j][A/B]为当通过前i辆A方向的车,和j辆B方向的车,最后一辆车的方向是A/B的时候最短时间。如果这道题的题意是每辆车只能是匀速,那么dp[i][j][A/B]的时间可以从dp[i-1][j][A/B]转移而来,但是这里因为不是匀速直接这样转移会出问题。所以可以这样来跟新,对于每一个i,j都当成是一个间断点,也就是刚好车辆”反向”的点,然后去更新后面都是顺序通过的点,这样就能保证最后一定是最优的结果。如果还是不能理解,参考代码吧。
#include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 200 + 5; struct Car { int s, d; Car() {} Car(int s, int d):s(s), d(d) {} }; Car A[maxn], B[maxn]; int dp[maxn][maxn][2]; void DP(int p, int q) { for(int i = 0; i <= p; i++) { for(int j = 0; j <= q; j++) { for(int k = 0; k < 2; k++) { dp[i][j][k] = inf; } } } dp[0][0][0] = dp[0][0][1] = 0; for(int i = 0; i <= p; i++) { for(int j = 0; j <= q; j++) { int s = dp[i][j][0], t = s; for(int k = j + 1; k <= q; k++) { s = max(s, B[k-1].s); t = max(t, s + B[k-1].d); dp[i][k][1] = min(dp[i][k][1], t); s += 10; t += 10; } s = dp[i][j][1]; t = s; for(int k = i + 1; k <= p; k++) { s = max(s, A[k-1].s); t = max(t, s + A[k-1].d); dp[k][j][0] = min(dp[k][j][0], t); s += 10; t += 10; } } } } int main() { int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); int p = 0, q = 0; for(int i = 0; i < n; i++) { char dir; int t, d; cin >> dir >> t >> d; if(dir == 'A') { A[p++] = Car(t, d); } else { B[q++] = Car(t, d); } } DP(p, q); printf("%d\n", min(dp[p][q][0], dp[p][q][1])); } return 0; }
相关文章推荐
- hdu 3264 Open-air shopping malls(求圆相交的面积,二分)
- 解决no cpu/abi system image available for this target的问题
- 谷歌发布自动回复邮件人工智能技术
- tail命令
- 把OnDraw和OnPaint弄清楚(转贴)
- soj 2505: The County Fair(离散化 + 记忆化搜索)
- Handler.obtainMessage()
- 无法真机调试Installation failed with the following output:pkg: /data/local/tmp/Package.apk
- 机器学习
- 函数waitpid和WTERMSIG说明
- 百度大数据+零售发挥引擎优势 ------BDL ,大数据+亚当科茨领导的人工智能实验室和由张潼领导的大数据实验室
- 记一次Time-Wait导致的问题
- Flashback还原failover的备库实验
- 非互质中国剩余定理求线形模方程组(形如 X%mi=ai)
- leetcode-Factorial Trailing Zeroes
- Elasticsearch _analyze, _explain和 _search_shards工具
- Google Apps - Gmail API的通知功能
- svn commit: remains in tree-conflict
- NSSearchPathForDirectoriesInDomains
- HDU 4756 Install Air Conditioning 块与块,非树边最短路