NC16655 [NOIP2005]过河
题目
题目描述
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
输入描述
第一行有一个正整数 ,表示独木桥的长度。
第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1<=S<=T<=10,1<=M<=100。
第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。
所有相邻的整数之间用一个空格隔开。
输出描述
只包括一个整数,表示青蛙过河最少需要踩到的石子数。
示例1
输入
10 2 3 5 2 3 5 6 7
输出
2
备注
对于30%的数据,L<=10000;对于全部的数据, 。
题解
知识点:线性dp,数论。
显然线性dp,但发现数据范围很大,数组装不下。思路不可能是别的,那看一下数据上有没有能动手脚的地方。
注意到每次跳的格数是 ,而两者大小都小于等于 ,并且石头数小于等于 ,可以看出实际石头间隔区间可能很大,有很多空间被浪费。现在有两个方案:离散化,数据可优化。前者不可行,因为dp需要中间这些空位不能离散掉,考虑后者。
注意到有不定方程 ,其中 为总跳跃长度, , 为跳跃 的次数,只需要 即可有解。而这道题的跳跃区间是 ,因此只要一个区间内有互质的两个数 即可保证任意 都有解。但还有一个额外条件 ,因此实际上不是所有 都能被凑出来,但可以保证 时一定能被合法的凑出来。最后可以枚举证明, 任意两个相邻的数都是互质的,我们可以找区间里最小的两个数作为 。因此当 时 ,总能使得任意 被凑出来。
上面的结论告诉我们,实际上 的长度都可以被踩到,因此之后这些的位置其实都等价了没必要保留了,只需要保留 的即可 ,因此当两个石头跨度 时,手动修改为 即可,其余的间距保留不变,这样就能dp了。
特判一下 的情况即可。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; int a[107], b[107], dp[10107]; bool vis[10107]; int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int L; cin >> L; int s, t, m; cin >> s >> t >> m; for (int i = 1;i <= m;i++) cin >> a[i]; if (s == t) { int ans = 0; for (int i = 1;i <= m;i++) if (a[i] % s == 0) ans++; cout << ans << '\n'; return 0; } sort(a + 1, a + m + 1); int eps = s * t; for (int i = 1;i <= m;i++) { b[i] = b[i - 1] + min(a[i] - a[i - 1], eps);///>=st的值一定都能取到,不如缩短成100 vis[b[i]] = 1; } L = b[m] + min(L - a[m], eps); for (int i = 1;i < L + t;i++) {///可以越过L dp[i] = 0x3f3f3f3f; for (int j = s;j <= t;j++) if (i >= j) dp[i] = min(dp[i], dp[i - j] + vis[i]); } int ans = 0x3f3f3f3f; for (int i = L;i < L + t;i++) ans = min(ans, dp[i]); cout << ans << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16576273.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧