zoukankan      html  css  js  c++  java
  • 过河

    【题目描述】

    在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。

    由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0、1、······、L。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S、T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。

    现给出独木桥的长度L,青蛙跳跃的距离范围S、T,桥上石子的位置,询问青蛙最少需要踩到的石子数。

    【输入描述】

    输入共三行。

    第一行有一个正整数L(1 <= L <= 109),表示独木桥的长度;

    第二行有三个正整数S、T、M,分别表示青蛙一次跳跃的最小距离、最大距离及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100;

    第三行有M个不同的正整数,分别表示这M个石子在数轴上的位置(保证桥的起点和终点处没有石子)。

    【输出描述】

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

    【样例输入】

    10

    2 3 5

    2 3 5 6 7

    【样例输出】

    2

    【数据范围及提示】

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

    对于100%的数据,L <= 109

    源代码:
    
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int M,Num(0),Length,Left,Right,i[101],f[1000];
    bool Check[1000]={0};
    int main()
    {
        memset(f,0x3f,sizeof(f));
        scanf("%d%d%d%d",&Length,&Left,&Right,&M);
        for (int a=1;a<=M;a++)
          scanf("%d",&i[a]);
        sort(i+1,i+M+1);
        if (Left==Right) //特判。
        {
            for (int a=1;a<=M;a++)
              if (!(i[a]%Left))
                Num++;
            printf("%d",Num);
            return 0;
        }
        for (int a=1;a<=M;a++)
        {
            int T=i[a]-i[a-1]-Right;
            if (T>0)
              for (int b=a;b<=M;b++) //左移。
                i[b]-=T;
        }
        for (int a=1;a<=M;a++) //标记。
          Check[i[a]]=true;
        Length=i[M]+Right; //范围。
        f[Left]=Check[Left];
        for (int a=Left;a<=Length;a++)
        {
            for (int b=Left;b<=Right;b++) //其实C++数组编号也可以为负数。
              if (a>=b)
                f[a]=min(f[a],f[a-b]);
            f[a]+=Check[a];
        }
        printf("%d",f[Length]);
        return 0;
    }
    
    /*
        解题思路:
            状态转移方程很好想,但是会有冗余运算。
            不难发现,在一个大于最大移动步数的无石子区间内,有最大移动步数数量的格子是没有必要进行计算的,故可以进行压缩。
    */
  • 相关阅读:
    POJ 1887 Testing the CATCHER
    HDU 3374 String Problem
    HDU 2609 How many
    POJ 1509 Glass Beads
    POJ 1458 Common Subsequence
    POJ 1159 Palindrome
    POJ 1056 IMMEDIATE DECODABILITY
    POJ 3080 Blue Jeans
    POJ 1200 Crazy Search
    软件体系结构的艺术阅读笔记1
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5902820.html
Copyright © 2011-2022 走看看