Files
OI-source/2.1025.cpp
2023-08-03 09:22:52 +08:00

76 lines
1.6 KiB
C++

#include<cstdio>
#include<cstring>
#include<algorithm>
//#include<conio.h>
using namespace std;
const int oo=1<<30;
bool has_train[201][51][2];
int t[51],dp[201][51];
int n,T,i,j,m,d,ti,kase;
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
while(scanf("%d",&n)==1&&n)
{
memset(has_train,0,sizeof(has_train));
scanf("%d",&T);
for(i=1;i<=n-1;i++) scanf("%d",&t[i]);
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&d);
for(j=1,ti=d;j<=n&&ti<=T;ti+=t[j],j++)
has_train[ti][j][0]=1;
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&d);
for(j=n,ti=d;j>=1&&ti<=T;ti+=t[j-1],j--)
has_train[ti][j][1]=1;
}
// printf("right:\n");
// printf(" sta\\time");
// for(i=0;i<=T;i++) printf("%3d",i);
// printf("\n");
// for(i=1;i<=n;i++)
// {
// printf(" %d ",i);
// for(j=0;j<=T;j++) printf("%s",has_train[j][i][0]?" *":" ");
// printf("\n");
// }
// printf("left :\n");
// printf(" sta\\time");
// for(i=0;i<=T;i++) printf("%3d",i);
// printf("\n");
// for(i=1;i<=n;i++)
// {
// printf(" %d ",i);
// for(j=0;j<=T;j++) printf("%s",has_train[j][i][1]?" *":" ");
// printf("\n");
// }
// getch();
for(i=1;i<=n-1;i++) dp[T][i]=oo;
dp[T][n]=0;
for(i=T-1;i>=0;i--)
for(j=1;j<=n;j++)
{
dp[i][j]=dp[i+1][j]+1;
if(j<n&&has_train[i][j][0]&&i+t[j]<=T)
dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]); //right
if(j>1&&has_train[i][j][1]&&i+t[j-1]<=T)
dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]); //left
}
printf("Case Number %d: ",++kase);
if(dp[0][1]>=oo) printf("impossible\n");
else printf("%d\n",dp[0][1]);
// getch();
}
return 0;
}