回档|过河

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

题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。

对于30%的数据,L <= 10000;
对于全部的数据,L <= 10^9。

格式
输入格式

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

输出格式

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

样例输入:

10

2 3 5

2 3 5 6 7

样例输出:

2

题目分析:

这道题主要考察了区间类动态规划和我们对于代码的优化能力。事实上这道题是小Shy暑假做的,但不知道为啥小Shy把它翻译成C++之后只得了60分,所以只好发Pascal的代码了……

我们用f[i]表示走到i最少踩到的石子数。很明显当i

接下来我们会发现,如果两个石子之间的距离超过了t,那么相当于这两个石子之间没有距离t。因此我们把后面的石子全部前挪。挪动的幅度是kt。(k>=1)

然后我们就可以转移了。f[i]是从f[i-t]到f[i-s]中最小的转移过来的。

var f:array[1..10000] of longint;
  i,j,l,s,t,m,ans,p:longint;
  a:array[0..110] of longint;
  b:array[1..10000] of longint;

function min(a,b:longint):longint;
begin
  if a>b exit(b);  exit(a);
end;

begin
  readln(l);
  readln(s,t,m);
  for i:=1 to m do read(a[i]);
  for i:=1 to 10000 do f[i]:=maxlongint;
  if s=t then
    begin
      for i:=1 to m do if a[i] mod t=0 then inc(ans);
      writeln(ans);
      halt;
    end;
  for i:=1 to m do
    for j:=i+1 to m do
      if a[i]>a[j] then
        begin
          p:=a[i];
          a[i]:=a[j];
          a[j]:=p;
        end;
  for i:=1 to m do
    begin
      p:=a[i]-a[i-1]-t;
      if p>0 then
      for j:=i to m do a[j]:=a[j]-p;
    end;
  l:=min(a[m]+t,l);
  for i:=1 to m do b[a[i]]:=1;
  for i:=s to l do
    begin
      if i>t then for j:=i-t to i-s do f[i]:=min(f[i],f[j])
        else for j:=1 to i-s do f[i]:=min(f[i],f[j]);
      if f[i]=maxlongint then f[i]:=0;
      f[i]:=f[i]+b[i];
    end;
  writeln(f[l]);
end.
时间: 2024-11-03 05:43:01

回档|过河的相关文章

洛谷 【P1052】过河

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

贪心—— P1809 过河问题_NOI导刊2011提高(01)

洛谷——P1809 过河问题_NOI导刊2011提高(01) 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用时间. 现在已知N个人的渡河时间T,Oliver想要你告诉他,他们最少要花费多少时间,才能使所有人都过河. 注意,只有船在东岸(西岸)的人才能坐上船划到对岸. 输入输出格式 输入格式: 输入文件第一行为人数N,以下有N行

马拦过河卒心得体会

题目棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒". 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步. 输入一行四个数据,分别表示B点坐标和马的坐标.(保证所有的数据有解) 输出一个数据

NOIP2005 过河

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

hdu 4842(NOIP 2005 过河)之 动态规划(距离压缩)

/* hdu 4842(NOIP 2005 过河)之 动态规划(距离压缩) dp[i] := 到桥上的i位置,最少需要踩到的石子数. dp[i] = min(dp[i], dp[i-j] + isStone[i])    条件: (1) S<=j<=T (2) dp[i-j]是青蛙可以到达的点 独木桥长度L,最大为10^9,直接用转移方程,TLE:由于桥上的石子个数100,所以当石子分布在独木桥上时,是很稀疏的. (1)S!=T 考虑,对于此题关键在于求踩到的石子数,而非跳的次数,对于两个相邻

商人过河问题(DFS)

问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人.在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过河顺序才能让所有人都安全地过到河的另一边. 详细过程参见<数学模型>第四版(姜启源) #include <cstdio> #define maxn 101 int num;//number of bus or fol int graph[maxn*maxn][maxn*maxn]; i

【水】noip2002普及 过河卒

这题似乎是当年的马拦过河卒,好久的回忆啊... 过河卒 来源 NOIP2002普及组 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 25 的整数,并由键盘输入),同样马的

PDMS-DB之配置、回档、合并

DB,即database的简写,是PDMS中数据存储的载体.PDMS中各种各样的三维模型.平面图纸.数据库等等,几乎都存储在DB中.因此一旦DB发生异常,其后果将是毁灭性的,为此我们需要有一些技术手段来处理DB的问题. 1.Reconfigure 重新配置数据库 在使用PDMS的时候,由于网络的异常.操作的异常,也可能是程序本身的异常,使得PDMS非正常关闭.这些情况会导致有影子用户残留在项目中,或者有未正常解除的声明,最极端的会使得某些元素被锁定甚至损坏,使得该DB中数据出现异常. 一般来说,

Vijos P1002 过河 (NOIP提高组2005)

链接:https://www.vijos.org/p/1002 解析: 若 p*x+(p+1)*y=Q(采用跳跃距离p和p+1时可以跳至任何位置Q),则在Q ≥ P*(P-1)时是一定有解的. 由于题目给出的一个区间是1≤S≤T≤10,于是当相邻的两个石子之间的距离不小于8*9=72时,则后面的距离都可以到达,我们就可以认为它们之间的距离就是72.如此一来,我们就将原题L的范围缩小为了100*72=7200,动态规划算法完全可以承受了. 但是当S=T时,上述等式是无法使用的,在这种情况下,只需要