zoukankan      html  css  js  c++  java
  • luogu P1052 过河

    传送门

    容易想到设(f_i)表示走到坐标(i)的最少走过的石子数

    但是这题数据范围很大,,,

    不过一次可以走的步数范围是1-10,石子个数最多100个,所以中间会有很多多出来的没石子的路,可以考虑直接(skipped)

    我们只要对每个石子之间的路程$mod$2520救星了,因为每次走1-10步都有方法走2520步

    原因见下

    // luogu-judger-enable-o2
    #include<bits/stdc++.h>
    #define LL long long
    #define il inline
    #define re register
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    #define inf 999999999
    
    using namespace std;
    const int N=250000+3000,M=100+10,qihoo360=2520; //2520=lcm(1,2...10)
    il LL rd()
    {
        re LL x=0,w=1;re char ch=0;
        while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
        return x*w;
    }
    int f[N],g[N],s,t,m,a[M],l;
    
    int main()
    {
      l=rd(),s=rd(),t=rd(),m=rd()+1;
      a[m]=l;
      for(int i=1;i<m;i++) a[i]=rd();
      sort(a+1,a+m+1);
      for(int i=m;i>=1;i--) a[i]=(a[i]-a[i-1]-1)%qihoo360+1;
      for(int i=1;i<=m;i++) g[a[i]+=a[i-1]]=1;
      l=a[m],g[l]=0;
      for(int i=1;i<s;i++) f[i]=inf;
      for(int i=s;i<=l+10;i++)
        {
          f[i]=inf;
          for(int j=t;j>=s&&i-j>=0;j--)
            f[i]=min(f[i],f[i-j]+g[i]);
        }
      int ans=inf;
      for(int i=l;i<=l+10;i++) ans=min(ans,f[i]);
      printf("%d
    ",ans);
      return 0;
    }
    
    
    
  • 相关阅读:
    BUAA OO Unit1 表达式求导
    中介者模式
    命令模式
    观察者模式
    解释器模式
    策略模式
    迭代器模式
    模板方法模式
    代理模式
    桥接模式
  • 原文地址:https://www.cnblogs.com/smyjr/p/9676685.html
Copyright © 2011-2022 走看看