LGOJP1941 飞扬的小鸟
题目链接
题解
\(f[i][j]\)表示位置\((i,j)\)到达需要的最小点击数。
\(f[i][j]=\min\{{f[i-1][j-kx]+k},f[i-1][j+y]\}\)
\(O(nm^2)\)
考虑优化,首先\(f\)可以滚动,然后考虑优化掉一个\(m\)。
设\(g[j]\)表示\((i-1,j)\)往下每\(x_i\)个单位的\(\min\)。显然有\(g[j]=\min\{f[i][j],g[j-x_{i}]+1\}\)
那么则有\(f[i][j]=\min\{g[j-x_i]+1,f[i-1][j+y]\}\)。复杂度\(O(nm)\)。
有个需要注意的点是到了跳到m就不能再高了,所以对于\(\{(i,j)|j+x_i>m\}\)的点没办法利用g\(O(1)\)转移(共有m-j个合法可转移点),这个可以通过对g维护一个后缀\(\min\)解决。
好像也可以类比01背包和完全背包来转移。不过我想的时候没想到那个方向QAQ。
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 10010;
int n, m, k, f[2][1010], g[1010], x[N], y[N];
int p[N][2];
int main() {
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < n; ++i)
scanf("%d%d", &x[i], &y[i]), p[i][0] = 0, p[i][1] = m + 1;
p[n][0] = 0; p[n][1] = m + 1;
for(int i = 1; i <= k; ++i) {
int px, l, h;
scanf("%d%d%d", &px, &l, &h);
p[px][0] = l; p[px][1] = h;
}
int cur = 0, to = 0, min_val = inf;
for(int i = 1; i <= n; ++i) {
cur ^= 1;
for(int j = 1; j <= m; ++j) f[cur][j] = inf;
for(int j = 1; j <= m; ++j) {
if(j <= p[i][0] || j >= p[i][1]) continue;
if(j == m) f[cur][j] = min(f[cur][j], min_val + 1);
if(j - x[i - 1] > 0 && j - x[i - 1] > p[i - 1][0])
f[cur][j] = min(f[cur][j], g[j - x[i - 1]] + 1);
if(j + y[i - 1] <= m && j + y[i - 1] < p[i - 1][1])
f[cur][j] = min(f[cur][j], f[cur ^ 1][j + y[i - 1]]);
if(f[cur][j] != inf) to = i;
}
for(int j = 1; j <= m; ++j) g[j] = inf;
min_val = inf;
for(int j = 1; j <= m; ++j) {
g[j] = f[cur][j];
if(j - x[i] > 0) g[j] = min(g[j], g[j - x[i]] + 1);
if(j + x[i] >= m)
min_val = min(min_val, g[j]);
}
}
if(to == n) {
int ans = inf;
for(int j = 1; j <= m; ++j) ans = min(ans, f[cur][j]);
printf("1\n%d\n", ans);
} else {
int tot = 0;
for(int i = 0; i <= to; ++i) {
if(!(p[i][0] == 0 && p[i][1] == m + 1)) ++tot;
}
printf("0\n%d\n", tot);
}
return 0;
}
LGOJP1941 飞扬的小鸟的更多相关文章
- P1907飞扬的小鸟
P1907飞扬的小鸟 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或 ...
- [codevs3729]飞扬的小鸟
[codevs3729]飞扬的小鸟 试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果 ...
- Codevs 3729==洛谷P1941 飞扬的小鸟
P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 Flappy Bird 是一 ...
- NOIP2014 飞扬的小鸟
3. 飞扬的小鸟 (bird.cpp/c/pas) [问题描述] Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的 ...
- Codevs 3729 飞扬的小鸟
飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...
- [NOIP2014][DP]飞扬的小鸟
[NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...
- Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...
- UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP
#17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:// ...
- P1941 飞扬的小鸟(背包)
P1941 飞扬的小鸟 细节题 上升是完全背包 下降是01背包 (数组访问越界本机怎么能过???(大雾)) #include<iostream> #include<cstdio> ...
随机推荐
- react前端模版Material-UI.类似于antd/bootstrap
Material-UI Material-UI是一个实现了Google's Material Design设计规范的react组件库,开箱即用,使用它可以快速搭建出赏心悦目的应用界面. 文档 各种模版 ...
- centos7简单部署rancher
rancher官网文档地址 https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/ 准备机器 两台虚拟机 192.168.56.100 192 ...
- 在内网中 vue项目添加ECharts图表插件
原文地址:https://www.cnblogs.com/aknife/p/11753854.html 最近项目中要使用到图表 但是项目在内网中无法直接使用命令安装 然后我在外网中弄个vue的项目(随 ...
- spring boot 用@CONFIGURATIONPROPERTIES 和 @Configuration两种方法读取配置文件
spring cloud 读取 配置文件属性值 1.bean @Data public class LocalFileConfig { /** * 文件存储地址 */ private String ...
- LOJ2026 JLOI/SHOI2016 成绩比较 组合、容斥
传送门 感觉自己越来越愚钝了qwq 先考虑从\(n-1\)个人里安排恰好\(k\)个人被碾压,然后再考虑如何分配分数,两者乘起来得到答案. 对于第一部分,可以考虑容斥:设\(f_i\)表示\(i\)个 ...
- Unity项目 - 坦克大战3D TankBattle
目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏玩法:在有界的战场上,玩家将驾驶坦克,代表绿色阵营,与你的队友一起击溃红蓝阵营的敌人,在这场三方大战中夺得胜利! 操作指 ...
- .Net Core WebApi(1)— 入门
主要讲述利用EF Core的CodeFirst迁移数据库,简单接口增删改查的使用,利用Swagger生成接口文档. 1.新建项目 创建DbContext 和实体模型
- 利用脚本一键执行脚本,创建SharePoint文档库列表
SharePoint基于文档库和列表上进行二次开发,生成新的文档库和新的列表模板 通过新的模板,创建新的文档库与列表 --定义site对象$site = SPSite http://dvt176/si ...
- opencv 源码分析 CUDA可分离滤波器设计 ( 发现OpenCV的cuda真TM慢 )
1. 主函数 void SeparableLinearFilter::apply(InputArray _src, OutputArray _dst, Stream& _stream) { G ...
- 单例模式的双重锁为什么要加volatile(转)
单例模式如下: 需要volatile关键字的原因是,在并发情况下,如果没有volatile关键字,在第5行会出现问题. instance = new TestInstance();可以分解为3行伪代码 ...