https://www.luogu.org/problemnew/show/P1052

题目描述

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

  题目给出独木桥的长度 L, 青蛙跳跃距离的最小值 S, 最大值 T, 和桥上石子的位置. 你的任务是确定青蛙想要过河, 至少会踩到多少石子.

输入输出格式

输入格式:

  第一行有一个正整数 L ( 1 ≤ L ≤ 109 ), 表示独木桥的长度.

  第二行有三个正整数 S, T, M, 分别表示青蛙一次跳跃的最小距离, 最大距离以及桥上石子的个数, 其中 1 ≤ S ≤ T ≤ 10, M ≤ 100.

  第三行有 M 个互不相同的正整数, 表示 M 个石子在独木桥上的位置. 数据保证桥的起点和终点处没有石子. 所有相邻的整数间用一个空格分隔.

输出格式:

  一个整数, 表示青蛙想要过河最少需要踩到的石子数.

输入输出样例

输入样例:

10

2 3 5

2 3 5 6 7

输出样例:

2

解题思路

  • 状态转移方程

  设 f[i] 为走到 i 处所需踩的最少的石子数. 显然, 有 f[i] = min(f[i - j]) + flag[i] ( S ≤ j ≤ T ).

  • 路径压缩

  由 2017d1t1 可知, 任何与当前位置距离不小于 S * T 的点都是可以到达的, 所以第一个石头到起点的距离, 两个相邻石头之间的距离和最后一个石头到终点的距离如果大于 S * T, 就可以压缩到 S * T. 这样, 我们就可以把 109 的数据压缩到 104 以内.

  注意: 这个方法对于 S == T 的情况不适用, 需要进行特判.

实现

 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <algorithm>
 #define IsDigit(x) ((x) >= '0' && (x) <= '9')
 using namespace std;

 int l, s, t, m;
 ], road[], dp[], q[][];

 int Read(void)
 {
     );

     c = getchar();
     while (!IsDigit(c))
         c = getchar();
     do
         ret = ret *  + c - ';
     while ((c = getchar()) && IsDigit(c));
     return ret;
 }

 int main()
 {
     ), ), rr(-);

     l = Read();
     s = Read();
     t = Read();
     m = Read();
     ; i <= m; ++i)
         in[i] = Read();
     sort(, );
     if (s == t) {
         ans = ;
         ; i <= m; ++i)
              && ++ans;
         printf("%d\n", ans);
         ;
     }
     );
     ; i <= m; ++i) {
         in[i] -= mark;
         ] > base) {
             mark += ] - base;
             ] + base;
         }
         road[in[i]] = true;
     }
     l = min(in[m] + base, l);
     memset(dp, , sizeof(dp));
     dp[] = ;
     for (int i = s; i < l + t; ++i) {
         ])
             --rr;
         q[++rr][] = dp[i - s];
         q[rr][] = i - s;
         i - q[ll][] > t && ++ll;
         dp[i] = q[ll][] + road[i];
     }
     ans = ;
     for (int i = l; i < l + t; ++i)
         ans = min(dp[i], ans);
     printf("%d\n", ans);
     ;
 }

感谢我的数学老师

洛谷【P1052】过河的更多相关文章

  1. 洛谷p1052过河 路径压缩+dp

    洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...

  2. 洛谷P1052 过河

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

  3. 洛谷 P1052 过河

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

  4. 洛谷P1052 过河【线性dp】【离散化】

    题目:https://www.luogu.org/problemnew/show/P1052 题意: 青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数. 在河中有m个石头,要求在 ...

  5. 洛谷 P1052 过河 (离散化+dp)

    dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t 然后因为L非常大,所以我就不知道该怎么搞了 我看到m只有100,而L有1e9,我 ...

  6. 洛谷P1052过河

    题目 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了. 所以我们考虑一下路径压缩. 小数据Code #include <iostream> #include ...

  7. 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)

    题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...

  8. 洛谷P1809 过河问题_NOI导刊2011提高(01)

    To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...

  9. 洛谷 P1002过河卒

    洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...

  10. 洛谷P1002——过河卒

    又是洛谷题,要不是有小姐姐不会,我才不想动脑子.先贴一下题目地址https://www.luogu.org/problem/P1002 再贴一下题目: 我们读一下题目,这可不比学校的**算法题,读完一 ...

随机推荐

  1. 杂记(那些我还容易混淆的c和c++知识)

    1: 定义一个对象时先调用基类的构造函数.然后调用派生类的构造函数:析构的时候恰好相反:先调用派生类的析构函数.然后调用基类的析构函数.2:  多态性具体体现在运行和编译两个方面:在程序运行时的多态性 ...

  2. js如何将一个json数组对应放置到另一数组中去

    需要将上面这个数组的每一个元素对应添加至下面的数组中 最后合成为这样的数组: 使用for循环,将第一个数组中的元素循环到第二个数组中

  3. SpringBoot 动态打包

    配置pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  4. jquery file upload使用

    <!-- jquery file upload相关js --> <script src="/js/jquery-file-upload/js/jquery.ui.widge ...

  5. MySQL案例03:(MyCAT报错) [ERROR][$_NIOREACTOR-3-RW] caught err: java.lang.OutOfM emoryError: Unable to acquire 131072 bytes of memory, got 0

    上班坐下来没多久,接同事电话说有两台mysql服务器无法访问,其中这两台服务器是mycat服务器+MySQL服务器,具体处理过程如下: 一.错误信息 错误信息01: :: ::, [INFO ][$_ ...

  6. 【转】C#计算两坐标点距离

    //地球半径,单位米 ; /// <summary> /// 计算两点位置的距离,返回两点的距离,单位 米 /// 该公式为GOOGLE提供,误差小于0.2米 /// </summa ...

  7. 服务器远程连接mysql问题解决

    一. centos下解决远程连接不上的问题. 1.查看centos 下防火墙是否关闭: 通过进程: ps -aux |grep firewalld ps -ef |grep firewalld 通过服 ...

  8. Hive(10)-文件存储格式

    Hive支持的存储数据的格式主要有:TEXTFILE .SEQUENCEFILE.ORC.PARQUET 一. 列式存储和行式存储 左边为逻辑表,右边第一个为行式存储,第二个为列式存储 1. 行式存储 ...

  9. Rails中生成并在ActionMailer附件中发送csv、excel、pdf、zip文件

    1.修改Gemfile # PDF generator gem 'prawn' gem 'prawn-table' # Excel generator gem 'rubyXL' #Zip genera ...

  10. 深入浅出MFC学习笔记 第三章 MFC六大关键技术之仿真

    0:MFC类层次结构 1:MFC程序的初始化过程CWinApp::InitApplication()CMyWinApp::InitInstance()CMyFrameWnd::CMyFrameWnd( ...