博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2005过河(青蛙过河)
阅读量:6967 次
发布时间:2019-06-27

本文共 1124 字,大约阅读时间需要 3 分钟。

这道题主要是因为L长度最大可以为1e9 而石子却最多只有100个 这样就浪费了很多时间空间 所以我们压缩一波路径就可以了 剩余的就是枚举每个点以及i-y到i-x的dp了

这里要说一句为什么要mod90 因为1~9两两的最大公倍数是90

#include
#include
#include
using namespace std;const int M=100007;int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;}int f[M],s[155],L,x,y,m,sz[M];int main(){ memset(f,127,sizeof(f)); L=read(); x=read(); y=read(); m=read(); for(int i=1;i<=m;i++) s[i]=read(); if(x==y){ int ans=0; for(int i=1;i<=m;i++) if(s[i]%x==0) ans++; printf("%d\n",ans); return 0; } s[m+1]=L; sort(s+1,s+m+2); for(int i=0;i<=m;i++) if(s[i+1]-s[i]>90) s[i+1]=s[i]+(s[i+1]-s[i])%90; for(int i=1;i<=m;i++) sz[s[i]]=1; for(int i=x;i<=y;i++) f[i]=(sz[i])?1:0; for(int i=2*x;i<=s[m+1];i++){ for(int j=x;j<=y;j++) if(j<=i) f[i]=min(f[i],f[i-j]); if(sz[i]) f[i]++; } printf("%d\n",f[s[m+1]]); return 0;}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7107189.html

你可能感兴趣的文章
Hello Juejin
查看>>
AndroidStudio导入或者新建项目一直build
查看>>
laravel项目
查看>>
Azure 文档 (SQL 数据仓库, Azure SQL 数据库文档)
查看>>
基于arm的多路温度采集控制系统(4)菜单界面
查看>>
大数据存储管理大趋势
查看>>
我的友情链接
查看>>
R478规划及实施—理想丰满、现实骨感
查看>>
FreeBSD scp xftp 无法使用时,考虑sftp。
查看>>
使用计划任务定时重启Server
查看>>
RedisCluster工具类
查看>>
我的友情链接
查看>>
htpasswd用法(即配置SVN密码加密)
查看>>
Android Service完全解析,关于服务你所需知道的一切(上)
查看>>
日志打印中的入参
查看>>
Microsoft Dynamics CRM 2013 配置之 添加配置 域证书服务器 和 ADFS
查看>>
your windows password does not match your Notes password
查看>>
TCP: time wait bucket table overflow解决方法
查看>>
CSS样式中设置table的cellspacing属性
查看>>
The method getTextContent() is undefined for the type Node
查看>>