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