洛谷【P1052】过河
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】过河的更多相关文章
- 洛谷p1052过河 路径压缩+dp
洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...
- 洛谷P1052 过河
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...
- 洛谷 P1052 过河
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷P1052 过河【线性dp】【离散化】
题目:https://www.luogu.org/problemnew/show/P1052 题意: 青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数. 在河中有m个石头,要求在 ...
- 洛谷 P1052 过河 (离散化+dp)
dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t 然后因为L非常大,所以我就不知道该怎么搞了 我看到m只有100,而L有1e9,我 ...
- 洛谷P1052过河
题目 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了. 所以我们考虑一下路径压缩. 小数据Code #include <iostream> #include ...
- 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)
题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...
- 洛谷P1809 过河问题_NOI导刊2011提高(01)
To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...
- 洛谷 P1002过河卒
洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...
- 洛谷P1002——过河卒
又是洛谷题,要不是有小姐姐不会,我才不想动脑子.先贴一下题目地址https://www.luogu.org/problem/P1002 再贴一下题目: 我们读一下题目,这可不比学校的**算法题,读完一 ...
随机推荐
- java SSM 框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码
A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技 ...
- CentOS7安装及相关配置转载
1. 怎样在 CentOS 7.0 上安装和配置 VNC 服务器 https://linux.cn/article-5335-1.html 2. 安装完最小化 RHEL/CentOS 7 后需要做的 ...
- Redis基本讲解
Redis基本讲解 首先我们要了解redis的使用试用范围,redis不像数据库能建立关系型的数据结构,除了有序集合能关联一个double类型的分数其它的几种都是单一存储的,所以他的局限性就比较高了, ...
- react 第一个组件 “hello world!”
一:在src下面新建Welcome.js 二:在Welcome.js中使用类式写法: import React from "react" class Welcome extends ...
- c#使用emit方法DB,实体相互转换
网上有很多ORM框架和数据库转换方法. c#由EF控制,但是大家知道的是影响效率和底层控制. 因此最近几个月一直在研究.最后产出了Hikari数据库连接池. 但是该库只是定位在连接池,无法有效进行后续 ...
- Innodb和Mysiam引擎的区别
一:区别 Mysiam: 1.是非事务安全型. 2.是表级锁. 3.如果执行大量的select,Mysiam是更好的选择. 4.select count(*)from table.Mysiam只简单的 ...
- 关于osi的7层与tcp的4层网络协议的理解
osi 七层模型 应用层 提供接口 表示层 机器语言的二进制转换 对话层 决定是否传输 传输层 确定可不可靠 排差错 控流 网络层 提供逻辑地址 选路 数据链路层 mac 错误检测 物理层 设备间的比 ...
- HCNA(一)网络传输介质
一 .同轴线缆 介绍:同轴线缆是一种早期的网络传输介质,同轴电缆的得名与它的结构相关,由内导体.外导体.绝缘介质和防护套四部分组成.同样支持10Mbps传输速率.现在已经基本被淘汰,不在应用于企业网络 ...
- 解决 vboxdrv.sh: failed: Cannot change group vboxusers for device /dev/vboxdrv.
来自:https://blog.csdn.net/su_cicada/article/details/86773043 virtualbox 报错 ,看提示让执行以下 sudo /sbin/vboxc ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...