1105 过河

2005年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond

题解
 查看运行结果

题目描述 Description

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

输入描述 Input Description

输入第一行有一个正整数L(1<=L<=109),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1<=S<=T<=10,1<=M<=100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。

输出描述 Output Description

输出只包括一个整数,表示青蛙过河最少需要踩到的石子数。

样例输入 Sample Input

10
2 3 5
2 3 5 6 7

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

数据规模

对于30%的数据,L<=10000;

对于全部的数据,L<=109。

分类标签 Tags 点此展开

动态规划 大陆地区 NOIP全国联赛提高组 2005年

题解:

①对于任一位置x , 只能由前面[x-t , x-s]这个范围的位置跳过来,因此只要先求出这些位置踩的石子数,找个最少的位置跳过来就ok。因此很容易想到动态转移方程:

f[x]=min(f[x-j])+stone[x]   ( j∈[s , t])

f[x]表示从桥头跳到x处需踩的最少石子数,stone[x]表示x处是否是石头(1表示是,0表示否)。

②桥长可达10亿,即状态数可达10亿。很显然,数组是不能开到这么大的,怎么办?由此我们想到,能否将状态数减少,又不影响结果呢?通过观察,题目中的石子数最多只有100,如果把这些石子数放到长度为10亿单位的桥上,那是多么的稀疏呀,这就为我们提供了可能。

怎么样压缩?压缩后两个石子间距离保留多长才不影响结果呢?

设第k个石子座标为x,第k-1个石子和第k个石子间距离足够大,则青蛙从两个石子间跳到第k个石子及之后的位置有:x、x+1、x+2、x+3……x+t-1。如果我们能保证,将石子k-1和石子k之间的距离缩短(即减少状态)后,青蛙依然能跳到这些位置,则可以平移。而这一点我们可以通过在两个石子间保留1个最小公倍数单位长度得到保证。

③注意特殊情况:当s=t时,只需考查石子是否是s的倍数即可。这种情况单独考查。

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5;
const int M=110;
int L,s,t,m,a[N],f[N];//f[i]表示青蛙跳到位置i最少踏的石子数
bool stone[N];//stone[x]表示位置x是否是石子,0表示不是,1表示是
void solve(){int d=0,k=s*t;for(int i=1,x;i<=m+1;i++){x=a[i]-d-a[i-1]; //x表示第i个石子和第i-1个石子的距离if(x>k) d+=x-k;//超过公倍数部分用作平移 a[i]-=d;stone[a[i]]=1;//标记平移后位置是石子
    }stone[a[m+1]]=0;//桥尾不是石子 f[0]=0;for(int i=1;i<a[m+1]+t;i++){//考查桥上到桥尾的所有位置 f[i]=1e9;for(int j=s;j<=t;j++){ //在i的前一个位置中找一个经历石子最少的if(i>=j) f[i]=min(f[i],f[i-j]);//注意判断i>=j
        }f[i]+=stone[i];}int ans=1e9;for(int i=a[m+1];i<a[m+1]+t;i++) ans=min(ans,f[i]);//在跳过桥后所有位置中找一个最小值 printf("%d\n",ans);
}
int main(){scanf("%d%d%d%d",&L,&s,&t,&m);for(int i=1,x;i<=m;i++) scanf("%d",&a[i]);sort(a+1,a+m+1); //对桥中间石子位置排序,这步必须要有 a[0]=0;a[m+1]=L;if(s==t){//这种情况只需考查石子是否是石子的倍数即可 int ans=0;for(int i=1;i<=m;i++) if(a[i]%s==0) ans++;printf("%d\n",ans);}else solve();return 0;
}

ps:输出3 6 10各得20分。

转载于:https://www.cnblogs.com/shenben/p/5859048.html

codevs 1105 过河相关推荐

  1. 洛谷——P1002 过河卒||codevs——T1010 过河卒

    https://www.luogu.org/problem/show?pid=1002#sub||http://codevs.cn/problem/1010/ 题目描述 棋盘上A点有一个过河卒,需要走 ...

  2. Codevs 1010 过河卒 2002年NOIP全国联赛普及组

    1010 过河卒 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 如图,A 点有一个过河卒 ...

  3. CodeVS 1010 过河卒 深度优先搜素

    题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如 ...

  4. 过河 2005年NOIP全国联赛提高组(离散化+dp)

    1105 过河 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 在河上有一 ...

  5. CodeVs天梯黄金Gold题解

    title: CodeVs天梯之Gold date: 2017-12-28 tags: 天梯 CodesVs categories: OI CodeVs天梯之Gold 2018.01.04 By gw ...

  6. [ CodeVS冲杯之路 ] P1116

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1116/ 数据很小,DFS可A,每层枚举颜色,判断相邻的点是否有重复的颜色,记得回溯时把颜色染回0,即无颜色 这里我使用 ...

  7. 袋鼠过河(动态规划)

    题目描述 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远.每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为 ...

  8. 【贪心】【codevs】1214 线段覆盖

    http://codevs.cn/problem/1214/ 我去这个题...wa的我都没脾气了... 我写while(~scanf("%d", &n))竟然是不对的... ...

  9. [codevs 1913] 数字梯形问题

    [codevs 1913] 数字梯形问题 题解: 本题就是加强版的 [codevs 1033] 蚯蚓的游戏问题. 分别针对三个规则建图.运行最小费用最大流. 规则1:从梯形的顶至底的m条路径互不相交. ...

最新文章

  1. 使用nLite集成驱动教程
  2. Thread优先级之让步
  3. python之while循环用法举例,break与continue的区别,格式化输出及运算符
  4. Python3的unittest用例按编写顺序执行
  5. 关于 resgen.exe已退出 代码为 2 的错误问题的解决办法。
  6. 用Raspberry Pi消除害虫
  7. 找回华为云删除的通讯录_找回小米手机误删照片只要10秒!人人都知道的方法,你怎能不知道...
  8. 去中心化抵押借贷市场当前总借款量94.24亿美元
  9. Word2003和2007如何隐藏去掉回车符
  10. 使用Kibana工具测试elasticsearch数据
  11. php高级编程 薛忠胜_2019年,最值得学习的编程语言是?
  12. JavaScript数组你都掰扯不明白,简历上你敢写精通JavaScript?
  13. JavaBean对象转Map对象
  14. FIORI静态磁贴配置
  15. java小项目之简单聊天室
  16. Flutter实战-请求封装(五)之Isolate线程改造
  17. 2022年迎接“金三银四”,为什么面试你总拿不到高薪?你所不知道的面试技巧
  18. OSINT 常用信息收集策略
  19. JVM的GC算法详解(二)
  20. return 的含义

热门文章

  1. 128条形码计算,利用Code 128字体实现条码打印
  2. 关于遮罩层无效的记录
  3. 自加计数器c语言程序,计数器 加1 C语言 程序.doc
  4. XamarinEssentials教程清空键值
  5. php jq ajax 4个下拉框联动案列,Ajax与Jquery结合数据库做出实现下拉框的二级联动...
  6. python父类和子类_python子类父类
  7. js小球与边框碰撞反弹_四叉树在碰撞检测中的应用
  8. 显示服务器图片url,服务器上图片的url地址
  9. 计算机专插本专业考哪些科目,2020年广东专插本要考什么?专插本考试科目有哪些?...
  10. 一种灵活,坚固且无凝胶的脑电图电极,可用于无创脑机接口