题目传送门

$30pts$

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

但是出了几次小坑 :首先答案不一定是$f[l]$,因为可能跳过去,但也算到达彼岸了。其次我用的$stone$数组不再代表石子个数,而是下标,所以开到$10000$。

 #include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int l,s,t,m,ans=;
int f[],stone[]; int main()
{
scanf("%d%d%d%d",&l,&s,&t,&m);
for(int i=;i<=m;i++)
{
int qwq=;
scanf("%d",&qwq);
stone[qwq]=;
}
memset(f,,sizeof(f));
f[]=;
for(int i=;i<=l;i++)
{
for(int j=s;j<=t;j++)
{
if(i-j<) break;
f[i]=min(f[i-j],f[i]);
}
if(stone[i]) f[i]++;
}
for(int i=;i<=t;i++) ans=min(ans,f[l-i]+stone[l]);
printf("%d",ans);
return ;
}

30 pts

$100pts$

下标太大了呀...达到了丧心病狂的$1e9$。考虑优化,转移貌似没得搞,考虑状态优化。其实注意到这个条件我们首先就应该想到离散化。因为虽然长度很大,但石子个数却很小。也就是说,两个石子间可能会有很长的空隙。

有两个压缩方法:膜2520和膜72。(一步青蛙最多跳10个单位)2520是1,2,3,4,5,6,7,8,9,10的最小公倍数,因此从一个点出发,无论青蛙能跳多少距离,它一定能到2520。当两个石子间的距离大于2520,我们对其取膜。因为当距离大于2520时,我们一定可以连续跳某次,不经过任何石子。这样我们就成功地进行了离散化。

同上,最后我们还要枚举跳过(一声)的情况。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 1000000 using namespace std; int l,s,t,m,ans=;
int stone[maxn],d[maxn],flag[maxn],f[maxn]; int main()
{
scanf("%d",&l);
scanf("%d%d%d",&s,&t,&m);
for(int i=;i<=m;i++) scanf("%d",&stone[i]);
sort(stone+,stone++m);
for(int i=;i<=m;i++) d[i]=(stone[i]-stone[i-])%;
for(int i=;i<=m;i++)
{
stone[i]=stone[i-]+d[i];
flag[stone[i]]=;
}
memset(f,,sizeof(f));
f[]=;
for(int i=;i<=stone[m]+t;i++)
{
for(int j=s;j<=t;j++)
{
if(i-j<) break;
f[i]=min(f[i-j],f[i]);
}
if(flag[i]) f[i]++;
}
for(int i=;i<=t;i++) ans=min(ans,f[i+stone[m]]);
printf("%d",ans);
return ;
}

AC

NOIp2005 过河【dp+离散化】By cellur925的更多相关文章

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

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

  2. P1052 过河(离散化+dp)

    P1052 过河 dp不难,重点是要想到离散化. 石子个数$<=100$意味着有大量空间空置,我们可以缩掉这些空间. 实现的话自己yy下就差不多了. #include<iostream&g ...

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

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

  4. POJ - 3666 Making the Grade(dp+离散化)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  5. CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)

    传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ...

  6. CF13C Sequence(DP+离散化)

    题目描述 给定一个序列,每次操作可以把某个数+1-1.要求把序列变成非降数列.求最少的修改次数. 输入输出样例 输入 #1 - 输出 #1 4 输入 #2 输出 #2 1 解题思路 这题是一道非常好题 ...

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

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

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

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

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

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

随机推荐

  1. JSP简明教程:汇总

    原创JSP教程,简洁明了,不含废话. JSP简明教程(一):JSP简单介绍 JSP简明教程(二):JSP基本的语法 JSP简明教程(三):JSP隐含对象 JSP简明教程(四):EL表达式语言.Java ...

  2. Allegro改动shape网络节点

    使用Allegro时改动shape的网络节点方法: ①选择shape->Select Shape or Void/Cavity ②选择要改动的shape ③点击(...)改动网络节点的名字 ④改 ...

  3. centos7+php7 swoole 安装

    下载 swoole 首先下载swoole的源码包,这个操作很简单,没有太多说的. wget -c https://github.com/swoole/swoole-src/archive/v2.0.6 ...

  4. layer弹层

    获得 layer 文件包后,解压并将 layer 整个文件夹(不要拆分结构) 存放到你项目的任意目录,使用时,只需引入 layer.js 即可. 注意:引入layer.js前必须先引入jquery1. ...

  5. java 的File文件

    文件是计算中一种主要的数据存储形式. 首先介绍一下,绝对路径和相对路径.绝对路径是书写完整路径,相对路径是值书写文件的部分路径.  d:\java\hello.java 就是据对路径.包括完整的路径d ...

  6. 杭电(hdu)1181 变形课

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submi ...

  7. UICollectionViewController xcode6.1 自定义Cell

    本文转载至 http://blog.csdn.net/daleiwang/article/details/40423219 UICollectionViewContAutolayoutstoryboa ...

  8. linux下的文件和文件夹的权限问题

    1 文件和文件夹的权限 文件和文件夹的权限设置的根本目的是控制人对它们的访问. 2 用户分类 本文件的拥有者.本文件所属的grou.其它用户. 3 也就是说 在读写文件或者文件夹时,要看看自己是属于哪 ...

  9. log Configuration

    Log4j – Configuring Log4j 2 - Apache Log4j 2 https://logging.apache.org/log4j/2.x/manual/configurati ...

  10. 在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案

    在安卓6.0以下的设备上,通过WifiManager.getConnectionInfo().getMacAddress()即可获取WLAN物理地址, 而在6.0及以上,以此方式获取到的MAC地址为固 ...