Time Limit: 1000 MS | Memory Limit: 65535 K |
Total Submit: 29(11 users) | Total Accepted: 9(9 users) | Special Judge: No |
題目給出獨木橋的長度L,青蛙跳躍的距離范圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。 Input 有多組測試數據。
對於每組測試數據,第一行四個正整數L, s, t, n(1 <= L <= 10^5, 1 <= s <= t <= 10,1 <= n <= 100),分別表示獨木橋的長度,青蛙一次跳躍的最小距離,最大距離,及橋上石子的個數。第二行有n個不同的正整數分別表示這n個石子在數軸上的位置(數據保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用一個空格隔開。 Output 每組測試數據僅輸出一行,包括一個整數,表示青蛙過河最少需要踩到的石子數。 Sample Input 10 2 3 5
2 3 5 6 7 Sample Output
2
#include<stdio.h>
#include<string.h>
const int MAXN=100020;
int flag[MAXN];
int dp[MAXN];
int main()
{
int L,s,t,n;
int a;
while(scanf("%d%d%d%d",&L,&s,&t,&n)!=EOF)
{
memset(flag,0,sizeof(flag));
memset(dp,-1,sizeof(dp));//初始化,-1為不能到達的
//dp[i]表示到底 i 點需要經過的最少石子數,-1表示不能到達
for(int i=0;i<n;i++)
{
scanf("%d",&a);
flag[a]=1;//有石子為1,否則為0
}
dp[0]=0;
for(int i=s;i<=L+t-1;i++)
{
for(int j=i-t;j<=i-s;j++)// j 點跳到 i 點
{
if(j>=0&&dp[j]!=-1)//j 點能夠跳到
{
if(dp[i]==-1)dp[i]=dp[j]+flag[i]; //第一次 直 接 給 值
else if(dp[i]>dp[j]+flag[i]) dp[i]=dp[j]+flag[i];//找小的值
}
}
}
int res=10000;
for(int i=L;i<=L+t-1;i++)//L 到 L+t-1 中最小的非 -1 值
{
if(dp[i]!=-1&&dp[i]<res) res=dp[i];
}
printf("%d\n",res);
}
return 0;
}