UVA 12222 Mountain Road

原创 2016年08月29日 14:41:03

题目链接:http://acm.hust.edu.cn/vjudge/problem/42128


题意:一条路两边都会有车来,但是一次只能走一个方向的,而且同向的车一起行驶的时候,路上的每个点经过车的时间至少相隔10s。给出车辆的信息,起始位置,最快经过道路时间和到达山路的时间,求出最后一辆车离开山路的最早时刻。某个车可以受前面的车影响而导致减速。


思路:dp[A][B][k]表示左边已经开走A辆车,右边已经开走B辆车,且最后一辆的方向为k(0/1)的最早时刻。对于某个状态dp[A][B][k],两种选择,左边开走x辆,右边开走x辆。为什么不一次只转移一辆呢,因为多辆车一起开是有时间缩减的,之间不是独立的。比如一辆慢车先开出去,再开出去一辆快车,那么快车追到慢车10s的时候就不得不放慢速度和慢车同速行驶。但是一辆辆考虑的话就会导致计算出来的快车出发时间会晚一些(全程最快速度跑完),而导致后面的车也发晚。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 999999999
#define mod 100000007

int n,nA,nB;
struct node
{
    int arrive,run;
}A[209],B[209];

int dp[209][209][2];

void init()
{
    cin>>n;
    nA = nB = 0;
    rep(i,1,n)
    {
        char c;
        getchar();
        c = getchar();
        if ( c == 'A' )
            nA++ , scanf("%d%d",&A[nA].arrive,&A[nA].run);
        else
            nB++ , scanf("%d%d",&B[nB].arrive,&B[nB].run);
    }
    Clean(dp,0x3f);
    dp[0][0][0] = dp[0][0][1] = 0;
}

void solve()
{
    rep(i,0,nA)
        rep(j,0,nB)
        {
            int st = dp[i][j][0],ed = 0;
            rep(k,i+1,nA)
            {
                st = max( st , A[k].arrive );
                ed = max( ed , st + A[k].run );
                dp[k][j][1] = min( dp[k][j][1] , ed );
                st += 10 , ed += 10;
            }
            st = dp[i][j][1];
            ed = 0;
            rep(k,j+1,nB)
            {
                st = max( st , B[k].arrive );
                ed = max( ed , st + B[k].run );
                dp[i][k][0] = min( dp[i][k][0] , ed );
                st += 10 , ed += 10;
            }
        }
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        init();
        solve();
        cout<<min( dp[nA][nB][0] , dp[nA][nB][1] )<<endl;
    }
    return 0;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 12222(dp)

题意:有一条单行道,A、B两端都会有车要通过,现在给出n辆车,每个车出发地点、出发时间、通过这条道路的时间,问最后一辆车离开这条路的最小时间点。注意,相向而行的车不能同时在路上,而同向的车之间保证有1...

uva 12222——Mountain Road

题意:有一个狭窄的山路,两辆车不能同时相向而行,并且同向的车的间隔不能小于10秒,给定一些车的起始时间,求最后一辆车离开的最短时间。 思路:递推,dp(i,j,k)表示A端过了i辆车,B端过...
  • bobodem
  • bobodem
  • 2015年12月18日 20:06
  • 327

uva 12222 - Mountain Road(dp+贪心)

题目链接:uva 12222 - Mountain Road 题目大意:给出n,表示有n辆车,每辆车有三个值,分别代表说车的终点,发车时间,以及到移动所需的最小时间。因为路是单行道,所以不可...

(intermediate) 网络流(时序模型+离散化) UVA 11167 - Monkeys in the Emei Mountain

Problem C Monkeys in the Emei Mountain Input: Standard Input Output: Standard Output   Xuexue is a ...

Uva-11167-Monkeys in the Emei Mountain

这个题白书上的,确实比较麻烦。想到网络流不难,但需要注意的是需要区间建...

uva 10803 - Thunder Mountain

//floyd算法//floyd算法描述:1.它是基于动规的//                     2.它是基于如下特点的:设k是i->j的中间点.那么:(1)如果从i到j的最短路径中不包含点k...

UVa10803 - Thunder Mountain

题意:坐标系内有n个点,距离小于等于10的任yi两点之间有边

uva 10803 Thunder Mountain

uva 10803 Thunder Mountain

UVa 11167 Monkeys in the Emei Mountain 最大流,区间模型,输出方案

Monkeys in the Emei Mountain

UVA 5713 Qin Shi Huang's National Road System

题解: 类似最小生成树,先做最小生成树然后枚举顶点,删边和加边。 #include #include #include #include #include using namespace st...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 12222 Mountain Road
举报原因:
原因补充:

(最多只允许输入30个字)