链接:https://vijos.org/p/1002

题意:一条长度为L(L <= 1e9)的桥上有N(1<= N <= 100)颗石头。桥的起点为0终点为L.一只青蛙从0开始跳,每次跳的长度在s,t(1<= s <= t <= 10)之间。问青蛙过河最少踩到的石头的数量?

思路:区间dp的感觉很强烈。。但是范围实在是太大了。并且有一种感觉就是当两颗相邻的石头之间的距离相距很远时,其中间的很大一段其实状态只是一个递推的关系,即只是传递,并没有改变一段区间的状态。并且有数学公式的支持;

p*x + (p+1)*y = Q;其中p,p+1表示跳跃的距离,x,y分别表示对于跳跃距离的次数;

当Q >= p(p-1)时,从该起点到Q之后的每一个点都能到达。证明很简单,只需要通过mod就可以得出x,y的取值;

这样直接特判s = t的情况,之后离散化距离;

当a[i] - a[i-1] >= 90(原本应该是72的,但是wa了一点...),直接mod 90即可;

被各种初始化...WA了;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
#include<map>
#include<queue>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
typedef pair<int,int> PII;
#define A first
#define B second
#define MK make_pair
typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
int T,kase = ,i,j,k,n,m;
int dp[],a[],p[],tmp[];
int main()
{
MSi(dp);
int l,s,t;
read1(l);
read3(s,t,m);
rep1(i,,m) read1(a[i]);
if(s == t){
int ans = ;
rep1(i,,m) if(a[i]%s == ) ans++;
printf("%d\n",ans);
return ;
}
sort(a,a+m+);
a[] = ,a[++m] = l;
rep1(i,,m){
tmp[i] = tmp[i-] + (a[i] - a[i-])%;//递推实现离散化距离
p[tmp[i]] = ;
}
rep1(i,s,t) dp[i] = p[i];
rep1(i,*s,tmp[m]){ //这边从2*s开始
int L = max(i-t,), r = i - s;
rep1(j,L,r) dp[i] = min(dp[i],dp[j]);
if(p[i]) dp[i]++;
}
printf("%d\n",dp[tmp[m]]-);//设置了L处也有石头
return ;
}

最新文章

  1. 为什么kafka使用磁盘而不是内存
  2. HTML的FormData对象
  3. 【Shell脚本】怎样表示一个for循环
  4. Entity Framework Code First (四)Fluent API - 配置属性/类型
  5. 【Git】笔记2
  6. hibernate映射文件one-to-one
  7. IMAP收邮件
  8. 恢复被win7覆盖的Ubuntu Grub
  9. Java中的异常处理(二)
  10. JVM 学习笔记(二)
  11. Asp.net MVC Web.config配置技巧
  12. Swift的初始化方法
  13. C#中字符串的处理,对象的引用及继承(Tenth day)
  14. VC程序快速删除自己(可能做升级程序的时候有用)
  15. cocos2d-x CCNode类
  16. 简单介绍移动端CSS3单位rem的用法
  17. Java表达式中的那些坑
  18. New UWP Community Toolkit - RangeSelector
  19. Zepto.js库touch模块代码解析
  20. Windows 计划任务

热门文章

  1. UNIX标准化及实现之功能测试宏
  2. Reviewing the Blog Module
  3. 在 iOS 8 中使用模糊效果
  4. 梭子鱼:APT攻击是一盘更大的棋吗?
  5. VIM 分割窗口
  6. Cstring到string
  7. 从svn上down下来的版本在本机启动时各种问题
  8. 主机开启后,显示器显示NO SIGNAL,无信号
  9. Android——四种AterDialog
  10. Microsoft SQL Server Product Samples:Database