题目链接

题目

题目描述

在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。

题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。

输入描述

第一行有一个正整数 \(L(1\leq L\leq 10^9)\),表示独木桥的长度。

第二行有三个正整数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;对于全部的数据,\(L\leq 10^9\) 。

题解

知识点:线性dp,数论。

显然线性dp,但发现数据范围很大,数组装不下。思路不可能是别的,那看一下数据上有没有能动手脚的地方。

注意到每次跳的格数是 \([s,t]\) ,而两者大小都小于等于 \(10\) ,并且石头数小于等于 \(100\) ,可以看出实际石头间隔区间可能很大,有很多空间被浪费。现在有两个方案:离散化,数据可优化。前者不可行,因为dp需要中间这些空位不能离散掉,考虑后者。

注意到有不定方程 \(ax + by = d\),其中 \(d\) 为总跳跃长度,\(a,b \in [s,t]\) ,\(x,y\) 为跳跃 \(a,b\) 的次数,只需要 \(gcd(a,b)|d\) 即可有解。而这道题的跳跃区间是 \([s,t]\) ,因此只要一个区间内有互质的两个数 \(a,b\) 即可保证任意 \(d\) 都有解。但还有一个额外条件 \(x,y\geq 0\) ,因此实际上不是所有 \(d > 0\) 都能被凑出来,但可以保证 \(d> ab\) 时一定能被合法的凑出来。最后可以枚举证明,\([1,10]\) 任意两个相邻的数都是互质的,我们可以找区间里最小的两个数作为 \(a,b\) 。因此当 \(s \neq t\) 时 ,总能使得任意 $d> st $ 被凑出来。

上面的结论告诉我们,实际上 \(d> st\) 的长度都可以被踩到,因此之后这些的位置其实都等价了没必要保留了,只需要保留 \(d \leq st\) 的即可 ,因此当两个石头跨度 \(> st\) 时,手动修改为 \(st\) 即可,其余的间距保留不变,这样就能dp了。

特判一下 \(s = t\) 的情况即可。

时间复杂度 \(O(m\log m + t(L+t))\)

空间复杂度 \(O(m + L)\)

代码

#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;
}

NC16655 [NOIP2005]过河的更多相关文章

  1. [codevs1105][COJ0183][NOIP2005]过河

    [codevs1105][COJ0183][NOIP2005]过河 试题描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青 ...

  2. NOIP2005过河[DP 状态压缩]

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  3. NOIP2005 过河

    过河 (river.pas/c/cpp) [问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正 ...

  4. [NOIP2005] 过河【Dp,思维题,缩点】

    Online Judge:Luogu P1052 Label:Dp,思维题,缩点,数学 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子 ...

  5. [vijos1002][NOIP2005]过河

    Description 给定一条数轴,起点为0,数轴的某些整数点上有石子.每次可以移动的区间为[S,T].求当到达或超过L时,最少踩到的石子数. Input 输入的第一行有一个正整数L(1 <= ...

  6. NOIP2005过河(青蛙过河)

    题目传送门 这道题主要是因为L长度最大可以为1e9 而石子却最多只有100个 这样就浪费了很多时间空间 所以我们压缩一波路径就可以了 剩余的就是枚举每个点以及i-y到i-x的dp了 这里要说一句为什么 ...

  7. NOIp2005 过河【dp+离散化】By cellur925

    题目传送门 $30pts$ 状态和转移都比较好想:设$f[i]$表示跳到$i$位置,踩到的最小石子数.转移方程也很明了,为$f[i]$=$min${$f[i-j]$),,这个位置有石子时答案再加1,$ ...

  8. [题解+总结]NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  9. 【游记】NOIP 2017

    时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...

  10. OI 刷题记录——每周更新

    每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...

随机推荐

  1. google浏览器网页截取全屏

    本想在谷歌浏览器滚动截取网页全屏,没有找到好的方法,在网上找到一个快捷键,未曾使用过,特地记录下: 第一步:按F12打开 第二步:window:Ctrl + Shift + P mac:command ...

  2. [转帖]Oracle11g实现只读表方法

    1.1 ALTER TABLE tab_name READ ONLY 参考:https://www.cnblogs.com/chinas/p/8440460.html Oracle 11g开始支持设置 ...

  3. [转帖]AMD处理器ZEN一代之国产化海光

    https://huataihuang.gitbook.io/cloud-atlas-draft/os/linux/kernel/cpu/amd_hygon   2020年国产化处理器受到了广泛的关注 ...

  4. [转帖]FIO使用说明

    FIO介绍: FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类.FIO是一个可以产生很多线程或进程并执 ...

  5. [转帖]不同CPU性能大PK

    https://plantegg.github.io/2022/01/13/%E4%B8%8D%E5%90%8CCPU%E6%80%A7%E8%83%BD%E5%A4%A7PK/ 前言 比较Hygon ...

  6. vm-storage在全部都是旧metric情况下的写入性能测试

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 接上篇:测试所有metric都是存在过的metric的情况 ...

  7. 【k哥爬虫普法】Python程序员爬取视频资源13万部,一分钱没挣,获刑2年!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  8. 【JS 逆向百例】拉勾网爬虫,traceparent、__lg_stoken__、X-S-HEADER 等参数分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  9. net core部署iis执行此操作时出错web.config

    页面访问会报服务器内部错误,你点对应的IIS下的默认页面或模块会出现下面的错语. 请到官网下载对应的运行时:https://www.microsoft.com/net/download 如果是服务器, ...

  10. IConfigurationSectionHandler 接口的用法

    今天终于花了点时间了解一下IConfigurationSectionHandler 接口的用法 ,引以入门.首先建立一 RobsunConfigSectionHandler 专案,代码如下 : nam ...