传送门

Luogu

解题思路

考虑 \(\text{DP}\)

设 \(dp[i][j]\) 表示飞到 \((i, j)\) 这个点的最小触屏次数。

转移其实比较显然,但问题是每次上升时都可以点很多次,这一维次数如果枚举的话,就会带来复杂度的GG。

我们考虑到一个性质,这个无限次点每次都是增加固定的高度,有点像完全背包,于是我们就可以用完全背包的思想来优化,转移时也可以从当前这一列的下方转移。

还有就是如何判断解的情况。

我们从终点向起点枚举,取第一个可以被走到的列就好了。

细节注意事项

  • 咕咕咕

参考代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <ctime>
  9. #define rg register
  10. using namespace std;
  11. template < typename T > inline void read(T& s) {
  12. s = 0; int f = 0; char c = getchar();
  13. while (!isdigit(c)) f |= (c == '-'), c = getchar();
  14. while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
  15. s = f ? -s : s;
  16. }
  17. const int _ = 10000 + 10;
  18. const int __ = 1000 + 10;
  19. int n, m, k, x[_], y[_];
  20. int tp[_], bt[_], dp[_][__];
  21. int main() {
  22. #ifndef ONLINE_JUDGE
  23. freopen("in.in", "r", stdin);
  24. #endif
  25. read(n), read(m), read(k);
  26. for (rg int i = 0; i < n; ++i) read(x[i]), read(y[i]);
  27. for (rg int i = 1; i <= n; ++i) bt[i] = 0, tp[i] = m + 1;
  28. for (rg int a, i = 1; i <= k; ++i) read(a), read(bt[a]), read(tp[a]);
  29. memset(dp, 0x3f, sizeof dp);
  30. for (rg int i = 1; i <= m; ++i) dp[0][i] = 0;
  31. for (rg int i = 1; i <= n; ++i) {
  32. for (rg int j = 1; j <= m; ++j) {
  33. if (j >= x[i - 1]) {
  34. dp[i][j] = min(dp[i][j], dp[i - 1][j - x[i - 1]] + 1);
  35. dp[i][j] = min(dp[i][j], dp[i][j - x[i - 1]] + 1);
  36. }
  37. if (j == m) {
  38. for (rg int k = j - x[i - 1]; k <= m; ++k) {
  39. dp[i][j] = min(dp[i][j], dp[i - 1][k] + 1);
  40. dp[i][j] = min(dp[i][j], dp[i][k] + 1);
  41. }
  42. }
  43. }
  44. for (rg int j = bt[i] + 1; j <= tp[i] - 1; ++j)
  45. if (j + y[i - 1] <= m) dp[i][j] = min(dp[i][j], dp[i - 1][j + y[i - 1]]);
  46. for (rg int j = tp[i]; j <= m; ++j) dp[i][j] = 0x3f3f3f3f;
  47. for (rg int j = bt[i]; j >= 1; --j) dp[i][j] = 0x3f3f3f3f;
  48. }
  49. int cnt = k, ans = 0x3f3f3f3f;
  50. for (rg int i = n; i >= 1; --i) {
  51. for (rg int j = bt[i] + 1; j <= tp[i] - 1; ++j)
  52. ans = min(ans, dp[i][j]);
  53. if (ans < 0x3f3f3f3f) break; if (tp[i] <= m) --cnt;
  54. }
  55. if (cnt == k) printf("1\n%d\n", ans);
  56. else printf("0\n%d\n", cnt);
  57. return 0;
  58. }

完结撒花 \(qwq\)

「NOIP2014」飞扬的小鸟的更多相关文章

  1. Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)

    Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...

  2. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

  3. [NOIP2014][DP]飞扬的小鸟

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

  4. 【NOIP2014】飞扬的小鸟

    看syq的代码写出来的,chty_orz 原题: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小 ...

  5. 「NOIP2014」「Codevs3728」 联合权值(乱搞

    3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 输入描述 Input Description 输出描述 Ou ...

  6. 「NOIP2014」「LuoguP2296」 寻找道路

    Description 在有向图 G 中,每条边的长度均为 1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在 ...

  7. 「NOIP2014」联合权值

    传送门 Luogu 解题思路 因为这是一棵树,所以说两个点如果能产生联合权值,那么它们就只能通过唯一的一个中转点来匹配,所以我们就枚举这个中转点. 但是我们又会发现,如果把每个点周围的点抠出来进行两两 ...

  8. LOJ2500 NOIP2014 飞扬的小鸟 【背包DP】*

    LOJ2500 NOIP2014 飞扬的小鸟 LINK 题目大意就是说有n个柱子,在每一秒你可以选择不点下降高度y和点p次上升x∗p,若果当前位置加上x∗p大于上界m,就会停在m. 如果可以成功穿越所 ...

  9. [NOIP2014]飞扬的小鸟[DP]

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

随机推荐

  1. Java面向对象编程 -4

    声明static属性 static 是一个关键字,这个关键字主要是用来定义属性和方法. static内存分析 在正常开发之中每一个对象都要保存有各自的属性 所以此时程序没有问题 但是如果country ...

  2. Java面向对象编程 -1.4

    对象内存分析 对象实例化操作初步分析 Java之中类属于引用数据类型,引用数据类型最大的困难之处在于要进行内存的管理,同时在进行操作的时候也会有内存关系的变化. 所以本次针对于之前的程序的内存关系进行 ...

  3. leetcode 0216

    目录 ✅ 893. 特殊等价字符串组 描述 解答 cpp py ✅ 811. 子域名访问计数 描述 解答 cpp py ✅ 509. 斐波那契数 描述 解答 cpp py ✅ 521. 最长特殊序列 ...

  4. js中的关键字与保留字

    关键字就是指:js中用到的单词,比如var : function: 保留字是指:js以后可能会发展成为关键字的,先保留起来不让你用.比如class,要是给一个对象添加class:obj.classNa ...

  5. 【摘录自MDN】对事件冒泡和捕捉的解释

    当一个事件触发了一个有父元素的元素(例如我们的<video>时),现代浏览器运行两个不同的阶段 - 捕获阶段和冒泡阶段. 在捕获阶段: 浏览器检查元素的最外层祖先(<html> ...

  6. 3分钟让你的Eclipse拥有自动代码提示功能

    第一步:Window->Preferences->Java 第二步:Java->Editor->Content Assist->Auto Activation->将 ...

  7. 为小学生出四则运算题目.java

    import java.util.Scanner; import java.util.Random; public class test{ public static int s1 = new Ran ...

  8. Trie学习总结

    Trie树学习总结 字典树,又称前缀树,是用于快速处理字符串的问题,能做到快速查找到一些字符串上的信息. 另外,Trie树在实现高效的同时,会损耗更多的空间,所以Trie是一种以空间换时间的算法. T ...

  9. PAT T1009 Triple Inversions

    树状数组判断三元逆序对~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; ]; long long l[maxn], ...

  10. C 语言入门第八章--C语言预处理命令

    例如:#include ,这种以#号开头的命令称为预处理命令. ===C语言宏定义(#define的用法)==== #define 叫做宏定义命令,它也是C语言预处理命令的一种.所谓宏定义,就是用一个 ...