我们先不管障碍物。

设 \(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. Go坑:time.After可能导致的内存泄露问题分析

    Go 中 time.After 可能导致的内存泄露 一.Time 包中定时器函数 go v1.20.4 定时函数:NewTicker,NewTimer 和 time.After 介绍 time 包中有 ...

  2. Prism Sample 21-PassingParameters

    这个例子是说明导航中传递参数,类似Asp.net中实现. 例子的模板,是例16中使用regionContext实现过的.在例16中, <Grid x:Name="LayoutRoot& ...

  3. 2022-06-03:a -> b,代表a在食物链中被b捕食, 给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。 来自理想汽车。

    2022-06-03:a -> b,代表a在食物链中被b捕食, 给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条. 来自理想汽车. 答案2022-06-03: 拓扑排序. ...

  4. 2022-01-29:连接词。 给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。 连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串

    2022-01-29:连接词. 给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 . 连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串 ...

  5. Vue Element-ui 之 el-table自动滚动

    首先是 div结构布局 <div id="scrollId">//对el-table盒子设置 id 属性 <div style="height: 100 ...

  6. LC19. 删除链表的倒数第 N 个结点

    删除链表的倒数第N个结点(中等) Q:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例: 示例一:输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3, ...

  7. blender 3D 建模仿真摄像头视角

    前言 摄像头的视角模拟,可以在产品概念设计阶段提供比较直观的视觉效果,通过将模型与实际环境进行校准,基本上可以通过模型来确定摄像头需要FOV,焦距,景深和安装位置及角度等参数. 由于工作需要,第一次自 ...

  8. 【GiraKoo】重置Android Studio环境的几个方案

    [GiraKoo]重置Android Studio环境的几个方案 Android Studio经常在编译时,发现一些奇奇怪怪的编译/运行问题. 明明是很小的改动,但是出现了一些不相关的错误.搞不清楚究 ...

  9. linux 管理进程和计划任务

    目录 一.进程原理 二.进程工作过程 三.进程类型 四.管理进程 五.前后台调度 六.定时任务 七.管理定时任务 一.进程原理 进程:指正在运行的程序称之为进程 程序:指的是没有运行的代码 线程:真正 ...

  10. 【QCustomPlot】性能提升之修改源码(版本 V2.x.x)

    说明 使用 QCustomPlot 绘图库的过程中,有时候觉得原生的功能不太够用,比如它没有曲线平滑功能:有时候又觉得更新绘图数据时逐个赋值效率太低,如果能直接操作内存就好了:还有时候希望减轻 CPU ...