UVA1025ASpyInTheMetro

来源:互联网 发布:ios10软件不受信任 编辑:程序博客网 时间:2024/06/07 10:07
//UVA1025ASpyInTheMetro#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define M(a) memset(a, 0, sizeof(a))using namespace std;const int INF = 1e6;int t[55];int have_train[260][55][2];int d[260][55];int main() {int N, T, kase = 0;while(scanf("%d", &N) == 1 && N) {scanf("%d", &T);for(int i = 1; i <= N - 1; i++) scanf("%d", &t[i]);int M1;scanf("%d", &M1);M(have_train);for(int i = 1; i <= M1; i++) {int Time, j = 1;scanf("%d", &Time);while(Time <= T && j < N) {have_train[Time][j][0] = 1;Time += t[j++];}//判断每一趟车每一时刻从每一点出发向右行驶的可行性 }int M2;scanf("%d", &M2);for(int i = 1; i <= M2; i++) {int Time, j = N;scanf("%d", &Time);while(Time <= T && j > 1) {have_train[Time][j][1] = 1;Time += t[--j];}}//逆向,原理同上     for(int i = 1; i < N; i++) d[T][i] = INF;d[T][N] = 0;    for(int i = T - 1; i >= 0; i--) {//以时间为序,由已知推导未知         for(int j = 1; j <= N; j++) {        d[i][j] = d[i + 1][j] + 1;//决策1,维持原状1个单位时间         if(j < N && have_train[i][j][0] && t[j] + i <= T)            d[i][j] = min(d[i][j], d[t[j] + i][j + 1]);//决策2,向左走一个站,考虑这段路程的时间//并继承左边车站的等待时间         if(j > 1 && have_train[i][j][1] && t[j - 1] + i <= T)             d[i][j] = min(d[i][j], d[t[j - 1] + i][j - 1]);            //同理于上 }}printf("Case Number %d: ", ++kase);if(d[0][1] > 1e5) printf("impossible\n");else printf("%d\n", d[0][1]); }return 0;} /**/

原创粉丝点击