[NOIP 2014] 飞扬的小鸟:需要一点小优化的DP

2023-10-20 20:19

本文主要是介绍[NOIP 2014] 飞扬的小鸟:需要一点小优化的DP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 这不是水题?
  2. 啊,写完了。等等,可以连击??!
  3. 连击也好处理。用同一列的更新自己就好。
  4. 啊,又快写完了。等等,我这样倒着推,又用的是滚动数组,好像难以确定游戏失败时最多飞越多少个管道间隙……
  5. 嗯,重写。WA,70分,挂成暴力DP了。让我来面向数据调试……
  6. 为了省一个循环,我竟然同时更新向上、向下……
  7. 改正。CE两次。咦,怎么还是70分?这次WA的测试点有所不同。
  8. 再次面向数据……高度为m时,只考虑了“1次越界”、“1+次正好”,而忽略了“连击越界”。
  9. 85分了!怎么和本机运行结果不一样?数组开小了1。
  10. 95分。这是什么鬼?
  11. 一天都在想这是怎么回事。第16个测试点,答案是“0 142”,我输出“0 141”。怎么会少1呢?
  12. 写个暴力吧。靠!我的暴力DP也输出“0 141”!
  13. 读了很多遍题,确认题意没搞错。
  14. 晚上,又写了个暴力,还是输出“0 141”。在数据和vfk的代码的帮助下,我发现找到的第一个无法通过的管道间隙是正确的。在那之前,有142个管道,但这一版暴力怎么返回141呢?
  15. 原来,我统计的是0~i-1有多少个管道间隙,还没更新i-1就break了。
  16. 那优化后的DP是哪里错的呢?我发现col变量计的是最后一个能通过的列,但是我写着写着就把它当成了第一个不能通过的列。一个等号引发的血案。
  17. 在AC之前,又WA一次。原因是我加了句if (col != i) break;,后面判无解没改,还是把now扫一遍。

下面是参考vfk的代码,借鉴了一些好的写法的实现。比如min_element这个函数。

想起LTY学长的《混分导论》里写道,想AC看吕教主的代码去。

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 10000, MAX_M = 1000, INF = 0x3f3f3f3f;
int n, m, u[MAX_N], d[MAX_N], l[MAX_N+1], h[MAX_N+1], f[2][MAX_M+1];inline bool in(int j, int i)
{return j < h[i] && j > l[i];
}int* dp(int& cnt)
{int* now = f[1], * pre = f[0], x, y;cnt = 0;for (int i = 1; i <= n; ++i) {swap(now, pre);for (int j = 1; j <= m; ++j) {x = j-u[i-1];now[j] = min(x > 0 ? now[x] : INF, in(x, i-1) ? pre[x] : INF) + 1;}for (int j = max(m-u[i-1], l[i-1])+1; j <= m; ++j)now[m] = min(now[m], min(now[j], j < h[i-1] ? pre[j] : INF) + 1);for (int j = 1; j <= m; ++j) {y = j+d[i-1];now[j] = min(now[j], in(y, i-1) ? pre[y] : INF);}bool flag = false;for (int j = l[i]+1; j < h[i]; ++j)flag = flag || now[j] < INF;if (!flag)break;if (h[i] <= m)++cnt;}return now;
}int main()
{int k;scanf("%d %d %d", &n, &m, &k);for (int i = 0; i <= n; ++i)h[i] = m+1;for (int i = 0; i < n; ++i)scanf("%d %d", &u[i], &d[i]);for (int i = 0; i < k; ++i) {int p, a, b;scanf("%d %d %d", &p, &a, &b);l[p] = a;h[p] = b;}int cnt, * ret = dp(cnt); if (cnt == k)printf("1\n%d\n", *min_element(ret+1, ret+m+1));elseprintf("0\n%d\n", cnt);return 0;
}

Think twice, code once.

这篇关于[NOIP 2014] 飞扬的小鸟:需要一点小优化的DP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/249481

相关文章

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义