标签:ccf memset event oid ssi opened scanf pre bsp
某城市地铁是线性的,有n(2≤n≤50)个车站,从左到右编号1~n。有M1辆列车从第1站开始往右开,还有M2辆列车从第n站开始往左开。
列车在相邻站台间所需的运行时间是固定的,因为所有列车的运行速度是相同的。
在时刻0,Mario从第1站出发,目的在时刻T(0≤T≤200)会见车站n的一个间谍。在车站等车时容易被抓,所以她决定尽量躲在开动的火车上,让在车站等待的时间尽量短。
列车靠站停车时间忽略不计,且Mario身手敏捷,即时两辆方向不同的列车在同一时间靠站,Mario也能完成换乘。
【输入格式】 输入文件包含数种情况,每一种情况包含以下7行:
第一行是一个正整数n,表示有n个车站 第二行是为T,表示Mario在时刻T见车站n的间谍 第三行有n-1个整数t1,t2,...,tn-1,其中ti表示地铁从车站i到i+1 的行驶时间 第四行为M1,及从第一站出发向右开的列车数目 第五行包含M1个正整数a1,a2,...,aM1,即个列车出发的时间 第六行为M2,及从第一站出 发向右开的列车数目 第七行包含M2个正整数b1,b2,...,bM2,即个列车出发的时间
最后一种情况以一行0结尾。
【输出格式】 有若干行,每行先输出“Case Number XXX: ”(XXX为情况编号,从1开始),再输出最少等待时间或“impossible”(无解)。
——摘抄自刘汝佳《算法竞赛入门经典》
1. 注意ti表示从i到i+1的时间
2. 题面t的范围有锅,要开到1e4
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+5; 4 const int INF=1e9+7; 5 int n,m1,m2,T,sum; 6 bool has[maxn][65][3]; 7 int dp[maxn][65]; 8 int t[205],a[205],b[205]; 9 int cas; 10 template <class t>void red(t &x) 11 { 12 x=0; 13 int w=1; 14 char ch=getchar(); 15 while(ch<‘0‘||ch>‘9‘) 16 { 17 if(ch==‘-‘) 18 w=-1; 19 ch=getchar(); 20 } 21 while(ch>=‘0‘&&ch<=‘9‘) 22 { 23 x=(x<<3)+(x<<1)+ch-‘0‘; 24 ch=getchar(); 25 } 26 x*=w; 27 } 28 void input() 29 { 30 freopen("input.txt","r",stdin); 31 } 32 void DP() 33 { 34 for(int i=1;i<n;++i) 35 dp[T][i]=INF; 36 dp[T][n]=0; 37 for(int i=T-1;i>=0;--i) 38 for(int j=1;j<=n;++j) 39 { 40 dp[i][j]=dp[i+1][j]+1; 41 int tm1=has[i][j][0]; 42 int tm2=has[i][j][1]; 43 if(j<n&&tm1&&T>=i+t[j]&&dp[i+t[j]][j+1]<dp[i][j]) 44 dp[i][j]=dp[i+t[j]][j+1]; 45 if(j>1&&tm2&&T>=i+t[j-1]&&dp[i+t[j-1]][j-1]<dp[i][j]) 46 dp[i][j]=dp[i+t[j-1]][j-1]; 47 } 48 } 49 int main() 50 { 51 input(); 52 while(scanf("%d",&n)==1&&n) 53 { 54 ++cas; 55 printf("Case Number %d: ",cas); 56 red(T); 57 memset(has,0,sizeof(has)); 58 for(int i=1;i<n;++i) 59 red(t[i]); 60 red(m1); 61 for(int j=1;j<=m1;++j) 62 { 63 red(sum); 64 for(int i=1;i<=n;++i) 65 { 66 has[sum][i][0]=1; 67 sum+=t[i]; 68 } 69 } 70 red(m2); 71 for(int j=1;j<=m2;++j) 72 { 73 red(sum); 74 for(int i=n;i>=1;--i) 75 { 76 has[sum][i][1]=1; 77 sum+=t[i-1]; 78 } 79 } 80 DP(); 81 if(dp[0][1]>=INF) 82 printf("impossible\n"); 83 else 84 printf("%d\n",dp[0][1]); 85 } 86 return 0; 87 }
标签:ccf memset event oid ssi opened scanf pre bsp
原文地址:https://www.cnblogs.com/Achensy/p/10775480.html