UVA#1025A Spy in the Metro

描述略

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int d[205][55];//时刻i在车站j,至少等多久
int train[205][55][2];//时刻i在车站j,是否有车
int tp[55];//车站间隔
const int INF = 1000000;
int main(){
	//freopen("d://poj//data.txt","w",stdout);
	int n,t,i,j,m1,m2,flag,sum;
	int ca = 0;
	while(scanf("%d",&n) && n){
		memset(train,0,sizeof(train));
		//fill(d[0],d[0] + 205 * 55,INF);
		++ca;
		scanf("%d",&t);
		tp[0] = 0;
		for(i = 1;i < n; ++i)
			scanf("%d",tp + i);
		scanf("%d",&m1);
		for(i = 0;i < m1; ++i){
			scanf("%d",&sum);
			while(sum <= t){
				for(j = 0;sum <= t && j < n - 1;++j){
					sum += tp[j];
					train[sum][j][0] = 1;
				}
				break;
//				for(j = n - 1;sum <= t && j > 0; --j){
//					train[sum][j][1] = 1;
//					sum += tp[j];
//				}
			}
		}
		scanf("%d",&m2);
		for(i = 0;i < m2; ++i){
			scanf("%d",&sum);
			while(sum <= t){
				for(j = n - 1;sum <= t && j > 0;--j){
					train[sum][j][1] = 1;
					sum += tp[j];
				}
				break;
//				for(j = 0;sum <= t && j < n - 1; ++j){
//					sum += tp[j];
//					train[sum][j][0] = 1;
//				}
			}
		}
		for(i = 0;i < n - 1; ++i)//dp来自紫书,哎~
			d[t][i] = INF;
		d[t][n - 1] = 0;
		for(i = t - 1;i >= 0; --i){
			for(j = 0;j < n; ++j){
				d[i][j] = d[i + 1][j] + 1;
				if(j < n - 1 && train[i][j][0] && i + tp[j + 1] <= t)
					d[i][j] = min(d[i][j],d[i + tp[j + 1]][j + 1]);
				if(j > 0 && train[i][j][1] && i + tp[j] <= t)
					d[i][j] = min(d[i][j],d[i + tp[j]][j - 1]);
			}
		}
		printf("Case Number %d: ",ca);
		if(d[0][0] >= INF)
			printf("impossible\n");
		else
			printf("%d\n",d[0][0]);
	}
	return 0;
}

Trains move in both directions: from the first station to the last station and from the last station back to the first station.
结果题目火车™是单程的?
当然此题中心还是状态的抽象以及状态转移方程:
开始是在t时到达n战时没有等待时间,求最开始最初站的等待时间。以时间为序列,向前递推状态转移有三种方式 等待一分钟(前一状态等待时间加一) 向右有车 向左有车。取最少等待时间。

发布了53 篇原创文章 · 获赞 0 · 访问量 716

猜你喜欢

转载自blog.csdn.net/weixin_38894974/article/details/104643222
今日推荐