码迷,mamicode.com
首页 > 其他好文 > 详细

luogu P1052 过河

时间:2018-09-19 22:03:09      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:print   etc   inline   getch   enable   原因   main   -o   ++   

传送门

容易想到设\(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\n",ans);
  return 0;
}

luogu P1052 过河

标签:print   etc   inline   getch   enable   原因   main   -o   ++   

原文地址:https://www.cnblogs.com/smyjr/p/9676685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!