P1816 跑步
题目描述
wzywzy 在跑步,由于昨天下雨了,所以跑道上某些位置堆积了雨水。wzywzy 并不希望自己踩到水坑,所以当他将要踩到水坑时候他会选择跳过去。 具体的,跑道可以抽象为长度为nn 的序列,wzywzy 从位置11 出发,目的地是到达位置nn。跑道上会有mm 个位置存在积水,他每次可以跳11 到kk 单位长度正整数的距离,问wzywzy 最少可以踩到几次水坑到达位置nn。
输入描述
输入第一行一个正整数TT,表示数据组数。 接下来每个数据第一行nn,mm,kk,分别代表路径的长度,积水的个数以及wzywzy 一次最远可以跨多远。
第二行共 m 个正整数a_iai,分别代表第ii 个水坑的位置。
输出描述
输出共TT 行,每行一个正整数,表示wzywzy 至少踩到几次水坑才能到达位置nn。
样例输入
Copy to Clipboard
1
6 3 2
2 3 5
样例输出
Copy to Clipboard
1
样例解释
位置22,33,55 存在水坑。wzywzy 最初在位置11,他只能到达位置22,33。一种可行的走法为1-2-4-61−2−4−6,共踩11 次水坑。显然这是踩最少次水坑的方式之一。
数据规模
第一个测试点数据规模为n\leq50n≤50,m\leq nm≤n,k\leq nk≤n。
第二个测试点数据规模为n\leq10000n≤10000,m\leq nm≤n,k\leq 50k≤50。
#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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~