题目大意:
给出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;
}