#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <vector> #include <cstring> #define INF 100000000 using namespace std; int n,T,m1,m2; int t[100]; int A1[100]; int A2[100]; int B1[100][100]; int B2[100][100]; int dp[300][100]; int find(int key,int *a,int len){ int ma = -1; for(int i = 0;i < len;i++){ if(a[i] <= key && a[i] > ma){ ma = a[i]; } } return ma; } int main(){ int q = 1; while(cin >> n,n){ scanf("%d",&T); for(int i = 1;i < n;i++){ scanf("%d",&t[i]); } scanf("%d",&m1); for(int i = 0;i < m1;i++){ scanf("%d",&A1[i]); B1[1][i] = A1[i]; } scanf("%d",&m2); for(int i = 0;i < m2;i++){ scanf("%d",&A2[i]); B2[n][i] = A2[i]; } for(int i = 2 ;i <= n;i++){ for(int j = 0;j < m1;j++){ B1[i][j] = B1[i-1][j] + t[i-1]; } } for(int i = n-1;i >= 1;i--){ for(int j = 0;j < m2;j++){ B2[i][j] = B2[i+1][j] + t[i]; } } for(int i = 0;i <= T;i ++){ for(int j = 0;j <= n;j++ ){ dp[i][j] = INF; } } //dp[i][j]的意思是第i时刻到达j站点的最小时间,只有三种状态能到达该状态 //1 原先就在这个位置然后再多等了1分钟 ,dp[i][j] = dp[i-1][j] //2 从他前一个站点到达然后开始等待,dp[i][j] = dp[x-t[j-1]][j-1] + i - x; //3 从他后一个站点到达然后才开始等待,dp[i][j] = dp[y-t[j]][j+1] + i - y; //取这三种之间最小的那个就是这个最小的时间了 dp[0][1] = 0; for(int i = 1;i <= T;i++){ for(int j = 1;j <= n;j++){ int a,c,d; a = dp[i-1][j] + 1; int x = find(i,B1[j],m1); int y = find(i,B2[j],m2); if(x < 0){ c = INF; } else{ if((j-1)> 0) c = dp[x-t[j-1]][j-1]+i-x; else c = INF; } if(y<0){ d = INF; } else{ if((j+1) <= n) d = dp[y-t[j]][j+1]+i-y; else d = INF; } dp[i][j] = min(a,min(c,d)); } } if(dp[T][n] != INF) printf("Case Number %d: %d\n",q++,dp[T][n]); else printf("Case Number %d: impossible\n",q++); } return 0; }
时间: 2024-10-18 07:58:09