我们先不管障碍物。

设 \(f[i][j]\) 表示来到点 \((i,j)\) 的最少点击屏幕数。

因为每秒要不上升 \(k\times x[i]\),要么下降 \(y[i]\)。

所以有:

\[f[i][j] = min(f[i - 1][j + y[i]], f[i - 1][j - k \times x[i]])
\]

这表示从上一秒转移过来,要不是从上一秒下降下来,那么上一秒就在 \(j + y[i]\),

要不是从上一秒上升上来,那么上一秒就在 \(j - k\times x[i]\)。

会 \(TLE\)。

下面进行优化:

首先看上升:

\(f[i][j] = min(f[i - 1][j - x[i]] + 1, f[i - 1][j - 2 \times x[i]] + 2, f[i - 1][j - 3 \times x[i]] + 3, \dots)\)

\(f[i][j - x[i]] = min(f[i - 1][j - 2 \times x[i]] + 1, f[i - 1][j - 3 \times x[i]] + 2, f[i - 1][j - 4 \times x[i]] + 3, \dots)\)

发现规律得:

\(f[i][j] = min(f[i - 1][j - x[i]] + 1, f[i][j - x[i]] + 1)\)。

下降直接处理即可,两个要分开处理!

细节:

  1. 初始状态:
\[f[0][j] = 0
\]
\[f[i][j] = \infty(i \not= 0)
\]
  1. 要统计超出高度 \(m\) 的一些点。

  2. 遇到障碍,把相应的 \(f\) 值设为 \(\infty\)。

  3. \(M\) 一定要开到 \(2000\),因为 \(j + y[i]\) 可能达到 \(2000\)。

代码;

#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; const int N = 10010, M = 2010; struct Node {
int x, l, r;
}c[N]; int n, m, cnt;
int x[N], y[N];
int f[N][M];
int cur = 1; int main () {
ios::sync_with_stdio(false);
cin.tie(nullptr); cin >> n >> m >> cnt;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
for (int i = 1; i <= cnt; i++) cin >> c[i].x >> c[i].l >> c[i].r;
sort(c + 1, c + cnt + 1, [](const Node& a, const Node& b){ return a.x < b.x; }); memset(f, 0x3f, sizeof(f));
for (int i = 0; i <= m; i++) f[0][i] = 0; for (int i = 1; i <= n; i++) {
for (int j = x[i]; j <= m + x[i]; j++) {
f[i][j] = min(f[i - 1][j - x[i]] + 1, f[i][j - x[i]] + 1);
}
for (int j = m + 1; j <= m + x[i]; j++) {
f[i][m] = min(f[i][m], f[i][j]);
}
for (int j = 1; j <= m - y[i]; j++) {
f[i][j] = min(f[i][j], f[i - 1][j + y[i]]);
}
if (c[cur].x == i) {
int l = c[cur].l, r = c[cur].r;
while (l >= 0) f[i][l] = 0x3f3f3f3f, l--;
while (r <= m) f[i][r] = 0x3f3f3f3f, r++;
int ans = 0x3f3f3f3f;
for (int j = 0; j <= m; j++) ans = min(ans, f[i][j]);
if (ans == 0x3f3f3f3f) {
cout << 0 << '\n' << cur - 1 << '\n';
exit(0);
}
cur++;
}
}
int ans = 0x3f3f3f3f;
for (int i = 0; i <= m; i++) ans = min(ans, f[n][i]);
cout << 1 << '\n' << ans << '\n';
return 0;
}

P1941 [NOIP2014 提高组] 飞扬的小鸟 题解的更多相关文章

  1. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  2. 垃圾陷阱 && [NOIP2014 提高组] 飞扬的小鸟

    #include<bits/stdc++.h> using namespace std; int d,n,dp[1010]; struct node{int t,f,h;} a[1010] ...

  3. noip2014提高组day2二题题解-rLq

    (又是昨天的作业……本题写于昨天) (这破题都做这么久,我是不是吃枣药丸……) (好吧这是一道图论题呢) 本题地址:http://www.luogu.org/problem/show?pid=2296 ...

  4. 刷题总结——飞扬的小鸟(NOIP2014提高组)

    题目: 题目背景 NOIP2014 提高组 Day1 试题. 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面 ...

  5. [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...

  6. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  7. NOIP2014提高组 题解报告

    D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...

  8. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  9. NOIP2014提高组 DAY1 -SilverN

    T1  生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的 ...

  10. noip2014 提高组

    T1 生活大爆炸版 石头剪刀布 题目传送门 就是道模拟题咯 #include<algorithm> #include<cstdio> #include<cstring&g ...

随机推荐

  1. 2020-12-12:现场写代码,把CPU打满,java和go都行,并解释为什么。

    福哥答案2020-12-12: 现在的电脑一般是多核的,单个for循环cpu是不会打满的. 我的电脑是四核八线程的,不管是java还是go,6个for循环就能把cpu打满,4个和5个cpu打不满. 为 ...

  2. 2022-11-24:小团在地图上放了3个定位装置,想依赖他们进行定位! 地图是一个n*n的棋盘, 有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在[1,n]内。 小团在(a,

    2022-11-24:小团在地图上放了3个定位装置,想依赖他们进行定位! 地图是一个n*n的棋盘, 有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在[1,n]内. 小团在(a, ...

  3. 2022-09-04:以下go语言代码输出什么?A:不能编译;B:45;C:45.2;D:45.0。 package main import ( “fmt“ ) func main() {

    2022-09-04:以下go语言代码输出什么?A:不能编译:B:45:C:45.2:D:45.0. package main import ( "fmt" ) func main ...

  4. 2022-01-16:小明手中有n块积木,并且小明知道每块积木的重量。现在小明希望将这些积木堆起来, 要求是任意一块积木如果想堆在另一块积木上面,那么要求: 1.上面的积木重量不能小于下面的积木重量;

    2022-01-16:小明手中有n块积木,并且小明知道每块积木的重量.现在小明希望将这些积木堆起来, 要求是任意一块积木如果想堆在另一块积木上面,那么要求: 1.上面的积木重量不能小于下面的积木重量: ...

  5. 安装vue cli3以及配置环境 镜像下载

    安装vue cli3以及配置环境 镜像下载 1.下载安装Node.js 安装vue cli3之前需要先安装Node.js,方便对vue进行下载 node.js的下载与安装方法在隔壁哟 地址:https ...

  6. Prompt Engineering优化原则 - 以Webshell代码解释为例

    一.LLM prompt优化原则 本文围绕"PHP代码解释"这一任务,讨论LLM prompt优化原则. 代码样例如下: <?php echo "a5a5aa555 ...

  7. 2014年蓝桥杯C/C++大学B组省赛真题(李白打酒)

    题目描述: 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店 ...

  8. postgresql 安装和配置

    ### 安装过程 \1. 下载Postgresql源码包: \# wget http://ftp.postgresql.org/pub/source/v9.4.3/postgresql-9.4.3.t ...

  9. 如何用ReadWriteLock实现一个通用的缓存中心?

    摘要:在并发场景中,Java SDK中提供了ReadWriteLock来满足读多写少的场景. 本文分享自华为云社区<[高并发]基于ReadWriteLock开了个一款高性能缓存>,作者:冰 ...

  10. 通过命令行创建ACFS文件系统

    其实使用asmca图形创建ACFS文件系统既简单又不容易出错,但是考虑到某些客户场景不允许我们调取图形,所以本文演示下通过命令行创建ACFS文件系统的步骤. 可以通过MOS搜索到下面这篇文档: ASM ...