uvalive4613

来源:互联网 发布:淘宝返利链接怎么做 编辑:程序博客网 时间:2024/06/06 19:26

题目大意:
给出n辆车的行走方向,到达时间和通过某段路的时间。
有一个单行道,只能让一辆车经过,为了保证安全两辆车之间经过同一个点的时间差要>=10 问所有的车经过这段路的最少时间。

思路:
dp[i][j][k]代表的是方向向左的经过i辆方向向右的经过j辆最后一辆车的方向为k的时候的经过这段路所需要使用的最少时间。
那么假设前一辆车发车的时间为s,到达终点的时间为t那么当前的车的发车是时间就是max(now.arrive,s + 10),即现在的车所到达这段路的时间和上一辆车发车时间+10的最大值。
那么当前的车到达终点的时间是max(t + 10,max(now.arrive,s + 10) + now.len),即上一辆车到达终点的时间+10与当前车的发车时间加上经过这段路所需要的时间的最大值。

代码:

#include <iostream>using namespace std;#include <cstring>#include <stdio.h>const int INF = 0x3f3f3f3f;const int maxn = 250;char str[5];struct node {    int arrive,len;}l[maxn],r[maxn];int dp[maxn][maxn][2];int main() {    int T;    scanf("%d",&T);    while(T--) {        int n;        scanf("%d",&n);        int numl = 0,numr = 0;        int a,b;        for(int i = 1; i <= n; i++) {            scanf("%s%d%d",str,&a,&b);            if(str[0] == 'A') {                numl++;                l[numl].arrive = a;                l[numl].len = b;            }            else {                numr++;                r[numr].arrive = a;                r[numr].len = b;            }        }        memset(dp,INF,sizeof(dp));        dp[0][0][0] = dp[0][0][1] = 0;        for(int i = 0; i <= numl; i++) {            for(int j = 0; j <= numr; j++) {                int st = dp[i][j][1],ed = 0;                for(int k = i + 1; k <= numl; k++) {                    st = max(st,l[k].arrive);                    ed = max(ed,st + l[k].len);                    dp[k][j][0] = min(dp[k][j][0],ed);                    st += 10;//下一辆车必须在当前车出发时间加10之后才能出发                    ed += 10;//下一辆车必须在当前车到达终点时间加10之后才能到达                }                st = dp[i][j][0],ed = 0;                for(int k = j + 1; k <= numr; k++) {                    st = max(st,r[k].arrive);                    ed = max(ed,st + r[k].len);                    dp[i][k][1] = min(dp[i][k][1],ed);                    st += 10;                    ed += 10;                }            }        }        int ans = min(dp[numl][numr][0],dp[numl][numr][1]);        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击