[vijos1002][NOIP2005]过河
Description
给定一条数轴,起点为0,数轴的某些整数点上有石子。每次可以移动的区间为[S,T]。求当到达或超过L时,最少踩到的石子数。
Input
输入的第一行有一个正整数L(1 <= L <= 109)。
第二行有三个正整数S,T,M,M表示桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。
第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的0和L处没有石子)。所有相邻的整数之间用一个空格隔开。
Output
输出只包括一个整数,表示最少踩到的石子数。
Sample Input
10
2 3 5
2 3 5 6 7
Sample Output
2
Solution
首先列出dp方程,f[i]表示到达i时最少踩到的石子数,则f[i]=min(f[i-k])(S<=k<=T)。
然后发现数据范围是109,所以需要状压一下。
经过思考可以发现,如果在k+S×T和k+S×T+x(k>=0,x>0)处有石子,则若存在一种方案可以越过k+S×T,那么也能越过k+S×T+x。
具体证明时把S×T看成T个S相加,易证能到达k+S×T,也能到达k+S×T+x。
所以只需将距离超过S×T的石子距离缩到S×T就可以了。
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define M 101
#define L 20001
using namespace std;
int a[M],f[L],l,m,s,t;
bool sto[L];
inline void init(){
scanf("%d%d%d%d",&l,&s,&t,&m);
for(int i=;i<=m;i++)
scanf("%d",&a[i]);
sort(a+,a++m);
if(s==t){
for(int i=;i<=m;i++)
if(!(a[i]%s)&&a[i]<=l)
f[]++;
printf("%d\n",f[]);
return;
}
for(int i=,d;i<=m;i++){
if(a[i]-a[i-]>s*t){
d=a[i]-a[i-]-s*t;
for(int j=i;j<=m;j++)
a[j]-=d;
}
sto[a[i]]=true;
}
if(l-a[m]>s*t) l=a[m]+s*t;
fill(f+,f++l,M);
for(int i=s;i<=l;i++){
f[i]=f[i-s];
for(int j=min(t,i);j>=s;j--)
f[i]=min(f[i],f[i-j]);
f[i]+=sto[i];
}
printf("%d\n",f[l]);
}
int main(){
freopen("river.in","r",stdin);
freopen("river.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}
[vijos1002][NOIP2005]过河的更多相关文章
- [codevs1105][COJ0183][NOIP2005]过河
[codevs1105][COJ0183][NOIP2005]过河 试题描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青 ...
- NOIP2005过河[DP 状态压缩]
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- NOIP2005 过河
过河 (river.pas/c/cpp) [问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正 ...
- [NOIP2005] 过河【Dp,思维题,缩点】
Online Judge:Luogu P1052 Label:Dp,思维题,缩点,数学 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子 ...
- NOIP2005过河(青蛙过河)
题目传送门 这道题主要是因为L长度最大可以为1e9 而石子却最多只有100个 这样就浪费了很多时间空间 所以我们压缩一波路径就可以了 剩余的就是枚举每个点以及i-y到i-x的dp了 这里要说一句为什么 ...
- NOIp2005 过河【dp+离散化】By cellur925
题目传送门 $30pts$ 状态和转移都比较好想:设$f[i]$表示跳到$i$位置,踩到的最小石子数.转移方程也很明了,为$f[i]$=$min${$f[i-j]$),,这个位置有石子时答案再加1,$ ...
- [题解+总结]NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- 【游记】NOIP 2017
时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
随机推荐
- HDU 1022 Train Problem I
A - Train Problem I Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- 快速排名 让人疯狂的黑帽seo技术
对于黑帽seo大家或许并不陌生,黑帽seo和白帽seo恰恰相反,是作弊手段.有白帽seo的时候,就有了黑帽seo一直到现在.但隔行如隔山这句话这句话一点都没错,再没接触黑帽seo技术之前我根本不知道黑 ...
- BZOJ 1016 【JSOI2008】 最小生成树计数
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- java反射详解(转)
本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象 ...
- Linux 信号详解四(pause,alarm)
pause函数 --将进程置为可中断睡眠状态,然后它调用内核函数schedule(),使linux进程调度器找到另一个进程来运行. --pause使调用者进程挂起,知道一个信号被捕获. alarm函数 ...
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
- [PGM] I-map和D-separation
之前在概率图模型对概率图模型做了简要的介绍.此处介绍有向图模型中几个常常提到的概念,之前参考的多为英文资料,本文参考的是<概率图模型-原理与技术的>中译版本.很新的书,纸质很好,翻译没有很 ...
- wap端开发必须基础
1. nitial-scale=1.0 确保网页加载时,以 1:1 的比例呈现,不会有任何的缩放. 在移动设备浏览器上,通过为 viewport meta 标签添加 user-scalable=no ...
- DeviceFamily XAML Views(一)
DeviceFamily Veiws 可以为特定的设备(Mobile.Desktop等)制作特定的XAML视图,这种方式可以完全定制XMAL和共享后台代码. 以 Mobile 和 Desktop 为例 ...
- js表单提交,面向对象
一.js表单验证之后再提交 1.普通按钮onclick函数调用表单的submit()函数 <input type=button name="submit1" value=&q ...