地鐵裡的間諜 UVA 1025 DP

2021-09-25 22:52:23 字數 1510 閱讀 7227

題目大意

某城市的地鐵是線性的,有n(2≤n≤50)個車站,從左到右編號為1~n。有m1輛列車從第1站開始往右開,還有m2輛列車從第n站開始往左開。在時刻0,mario從第1站出發,目的是在時刻t(0≤t≤200)會見車站n的乙個間諜。在車站等車時容易被抓,所以她決定盡量躲在開動的火車上,讓在車站等待的總時間盡量短。列車靠站停車時間忽略不計,且mario身手敏捷,即使兩輛方向不同的列車在同一時間靠站,mario也能完成換乘。輸入第1行為n,第2行為t,第3行有n-1個整數t1, t2, … , tn1(1≤ti≤70),其中ti表示地鐵從車站i到i+1的行駛時間(兩個方向一樣)。第4行為m1(1≤m1≤50),即從第1站出發向右開的列車數目。第5行包含m1個整數d1, d2,…, dm1(0≤di≤250,di<di+1),即各列車的出發時間。第6、7行描述從第n站出發向左開的列車,格式同第4、5行。輸出僅包含一行,即最少等待時間。無解輸出impossible。

(題目大意是粘網上的,題是真的難讀)

解題思路

dp[i][j]代表在第i時刻,在第j個地鐵站所等時間

多以dp[i][j]有三個轉移方程:

dp[i][j]=dp[i+1][j]+1;//等一分鐘

dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]);//坐上向右去的地鐵

dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]);//坐上向左去的地鐵

#include

#include

#include

using namespace std;

const

int maxt=

200+

5,maxn=55;

int vis[maxt]

[maxn][2

],dp[maxt]

[maxn]

,t[maxn]

;const

int inf=

0x3f3f3f3f

;int

main()

}}scanf

("%d"

,&m2)

;for

(int i=

1; i<=m2; i++)}

}//0正向,1負向

for(

int i=

1; i<=n; i++

) dp[t]

[i]=inf;

dp[t]

[n]=0;

for(

int i=t-

1; i>=

0; i--)}

printf

("case number %d: "

,p++);

if(dp[0]

[1]printf

("%d\n"

,dp[0]

[1])

;else

printf

("impossible\n");

}return0;

}

uva 1025,城市的間諜

題意 地鐵是線性的,有n個站,編號 1 n m1輛從左至右的車,和m2輛從右至左的車,發車時刻給出,然後是,每兩個站之間要跑多長時間。乙個間諜要從1車站到n車站,但是他要求等車的時間最短,不然間諜會被抓,有可能到不了,輸出impossible.分析 影響每一步的決策只有兩個因素,1,時刻,2,哪乙個...

UVa 1025 城市裡的間諜

題意 乙個間諜要從第乙個車站到第n個車站去會見另乙個,在是期間有n個車站,有來回的車站,讓你在時間t內時到達n,並且等車時間最短,輸出最短等車時間。思路 先用乙個has train t i 0 來表示在t時刻,在車站i,是否有往右開的車。同理,has train t i 1 用來儲存是否有往左開的車...

count 1 裡的1表示什麼

count 1 其實就是計算一共有多少符合條件的行.1並不是表示第乙個字段,而是表示乙個固定值.其實就可以想成表中有這麼乙個字段,這個字段就是固定值1,count 1 就是計算一共有多少個1.同理,count 2 也可以,得到的值完全一樣,count x count y 都是可以的.一樣的理解方式....