P1816 跑步

题目描述

wzywzy 在跑步,由于昨天下雨了,所以跑道上某些位置堆积了雨水。wzywzy 并不希望自己踩到水坑,所以当他将要踩到水坑时候他会选择跳过去。 具体的,跑道可以抽象为长度为nn 的序列,wzywzy 从位置11 出发,目的地是到达位置nn。跑道上会有mm 个位置存在积水,他每次可以跳11 到kk 单位长度正整数的距离,问wzywzy 最少可以踩到几次水坑到达位置nn

输入描述

输入第一行一个正整数TT,表示数据组数。 接下来每个数据第一行nnmmkk,分别代表路径的长度,积水的个数以及wzywzy 一次最远可以跨多远。

第二行共 m 个正整数a_iai,分别代表第ii 个水坑的位置。

输出描述

输出共TT 行,每行一个正整数,表示wzywzy 至少踩到几次水坑才能到达位置nn

样例输入

Copy to Clipboard
1
6 3 2
2 3 5

样例输出

Copy to Clipboard
1

样例解释

位置223355 存在水坑。wzywzy 最初在位置11,他只能到达位置2233。一种可行的走法为1-2-4-61246,共踩11 次水坑。显然这是踩最少次水坑的方式之一。

数据规模

第一个测试点数据规模为n\leq50n50m\leq nmnk\leq nkn

第二个测试点数据规模为n\leq10000n10000m\leq nmnk\leq 50k50

复制代码
#include<iostream>
using namespace std;
int n,m,k,T;
int a[10001],dp[10001];
int main(){
    cin>>T;
    while(T--){
        while(cin>>n>>m>>k){
        for(int i=1;i<=n;i++)
        {
        dp[i]=99999;
        a[i]=0;}
        for(int i=1;i<=m;i++)
        {
            int j;
            cin>>j;
            a[j]=1;
        }//
        if(a[1]==1)
        dp[1]=1;
        else
        dp[1]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(i+j>n)
                break;
                if(dp[i]+a[i+j]<dp[i+j])
                dp[i+j]=dp[i]+a[i+j];
            }
        }
        //for(int i=1;i<=n;i++)
        //cout<<dp[i]<<" ";
        //cout<<endl;
        cout<<dp[n]<<endl;}
    }
    return 0;
} 
复制代码

dp。这里选择的不是到每一个水坑的最小踩水坑数,而是选择了到每一个点的最小踩水数。

之前WA的几个点:

1.对    if(dp[i]+a[i+j]<dp[i+j])    这个判断理解不到位。之前对dp的思维太固化

2.a[]每次也要赋值为0

 
posted @   辛夸高岭桂  阅读(435)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示