当前位置: 首页 > news >正文

洛谷 P1233 【木棍加工】题解

算法:排序,DP(最长上升子序列)

前言:

此题的数据非常水,这里给予一组 hack 数据:

21
96 25 1 9 39 19 87 51 7 61 11 1 46 74 51 1 1 61 51 84 51 76 49 33 13 57 73 86 41 99 9 81 41 51 13 61 17 33 81 62 47 41 

请求加强数据!

------------

正文

我看题解里好多人写的都是贪心,唯一一个赞比较多的 DP 解法还被我的数据 hack 了,于是就写了这篇题解(其实我第一次提交的代码也会被 hack)。

这道题首先要用结构体排序,以木棍的长度为第一关键字(从大到小),以宽度为第二关键字排序(同样也是从大到小)。

需要注意的是,如果在两根木棍长度相等的情况下,必须要按宽度排序,否则就会被 hack。

在排序后,我们直接可以扔到这个长度不管了,直接把宽度跑一遍最长不上升子序列,得出最长不上升子序列的个数。但是我们知道,最长不上升子序列的个数等于最长上升子序列的长度,所以我们只需要求出后者即可。

$ \rm code $

# include <bits/stdc++.h>
using namespace std;
# define maxN 50005
struct Stick {
    int l, w;
}stick[maxN];
// 首先定义一个名字为 Stick 的结构体,存放木棍的长度和宽度.
int n, dp[maxN];
// 然后定义木棍的数量 n 和 dp 数组.
bool cmp(Stick, Stick);
// 这是排序函数.
int main() {
//    freopen("1.in", "r", stdin);
    cin >> n;
    for(int i = 1; i <= n; ++i) cin >> stick[i].l >> stick[i].w;
    sort(stick + 1, stick + 1 + n, cmp);
    // 输入数据,排序.
    dp[1] = stick[1].w;
    // dp 数组的初始化.
    int k = 1; // 答案最小也为 1.
    for(int i = 2, j; i <= n; ++i) j = lower_bound(dp + 1, dp + k + 1, stick[i].w) - dp, j <= k ? dp[j] = stick[i].w : dp[++k] = stick[i].w;
    //跑一遍最长上升子序列.
    cout << k << '\n', exit(0);
    // 输出答案.
}
bool cmp(Stick a, Stick b) {
    if(a.l != b.l) return a.l > b.l; // 如果两根木棍的长度不等,那么按木棍的长度从大到小排序.
    return a.w > b.w; // 否则按木棍的宽度从大到小排序.
}

 

转载于:https://www.cnblogs.com/Xray-luogu/p/11006416.html

相关文章:

  • 这算是CSS的bug吗?
  • MAC OS X IOS系统调用的处理
  • 8位二进制补码表示整数的最小值是什么,最大值是什么
  • ttlsa教程系列之mongodb——(五)mongodb架构-复制原理复制集
  • Eclipse中java获得mysql的查询结果集
  • 成熟的软件组件都是老板用大把、大把的钱堆出来烧出来的,以最简单的数据库访问组件为例...
  • Cookie 在前端中的实践
  • 事务(Transaction)
  • Android之ubuntu源码开发环境搭建笔记
  • [转]Nodejs基础中间件Connect
  • mybatis 中的where标签
  • 高并发量网站解决方案
  • WinPcap的开发与应用:获取设备列表
  • 什么是JSON ?
  • Java-优秀博客推荐
  • __proto__ 和 prototype的关系
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【笔记】你不知道的JS读书笔记——Promise
  • 5、React组件事件详解
  • E-HPC支持多队列管理和自动伸缩
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • leetcode讲解--894. All Possible Full Binary Trees
  • Meteor的表单提交:Form
  • Netty源码解析1-Buffer
  • Redis中的lru算法实现
  • scrapy学习之路4(itemloder的使用)
  • V4L2视频输入框架概述
  • WePY 在小程序性能调优上做出的探究
  • - 概述 - 《设计模式(极简c++版)》
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 深度学习中的信息论知识详解
  • 消息队列系列二(IOT中消息队列的应用)
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 正则与JS中的正则
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 正则表达式-基础知识Review
  • #微信小程序:微信小程序常见的配置传值
  • (2)Java 简介
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Java算法:二分查找
  • (转) Android中ViewStub组件使用
  • (转)winform之ListView
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .axf 转化 .bin文件 的方法
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证