P1233 木棍加工

简介: P1233 木棍加工

P1233 木棍加工

本题链接:P1233 木棍加工

本博客给出本题截图

image.png

AC代码

代码解释:按照长度从大到小排列,如果长度相同,则按照宽度从大到小进行排列,如此操作后,这个问题就变成了在n个数中,求不下降子序列最少个数,根据 dilworth定理:不下降子序列最小个数等于最大上升子序列的长度,故这个题就转换成了求n个数的最大上升子序列,f[i] 表示长度为 i 的(木棒宽度的)上升子序列结尾最小是多少,显然f是单调上升的,如果f数组的结尾元素小于a[i].w,那么就把a[i].w加入到f数组的结尾,反之利用二分法去找到当前比木棒宽度大的第一个位置并更新


代码*:

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5010;
struct dp
{
  int l, w;
}a[N];
int f[N];
int n, m;
bool cmp(dp b, dp c)
{
  if (b.l != c.l) return b.l > c.l;
  return b.w > c.w;
}
int main()
{
  cin >> n;
  for (int i = 1; i <= n; i ++ )
    cin >> a[i].l >> a[i].w;
  sort(a + 1, a + n + 1, cmp);
  int cnt = 0;
  for (int i = 1; i <= n; i ++ )
  {
    if (a[i].w > f[cnt])
      f[++ cnt] = a[i].w;
    else
    {
      int t = lower_bound(f + 1, f + 1 + cnt, a[i].w) - f;
      f[t] = a[i].w;
    }
  }
  cout << cnt << endl;
  return 0;
}

总结

dilworth定理不下降子序列最小个数等于最大上升子序列的长度





目录
相关文章
|
7月前
|
存储 SQL 缓存
实时数仓宽表加工解决方案
实时数仓宽表加工解决方案
186 0
实时数仓宽表加工解决方案
|
存储 JavaScript
八字油槽的加工
八字油槽的加工
八字油槽的加工
|
存储 分布式计算 DataWorks
如何正确的做增量加工
回到十多年前,增量加工这个方法并不是一种需要特别需要提出的方法,因为关系数据库的存储与计算性能十分有限(即便是MPP数据库平台也不是全都是做全量加工),增量加工是最普遍的方式。本文讲述了如何在MaxCompute上用与关系数据库的不同的方式做增量数据的加工。
1249 3
如何正确的做增量加工
|
数据采集 编解码 运维
SLS数据加工实现Hashids库对数据进行编码
Hashids是一个非常小巧的跨语言的开源库,它可以将数字编码成一个简短、唯一、非顺序的ID。
240 0
|
数据采集 SQL 分布式计算
数据治理中的数据血缘关系是什么?用来解决什么问题
前言: 数据血缘属于数据治理中的一个概念,是在数据溯源的过程中找到相关数据之间的联系,它是一个逻辑概念。 数据治理里经常提到的一个词就是血缘分析,血缘分析是保证数据融合的一个手段,通过血缘分析实现数据融合处理的可追溯。大数据数据血缘是指数据产生的链路,直白点说,就是我们这个数据是怎么来的,经过了哪些过程和阶段。
数据治理中的数据血缘关系是什么?用来解决什么问题
|
运维 监控 Kubernetes
SLS数据加工2021年技术总结
过去一年,SLS团队持续对数据加工服务进行了各方面迭代升级,本文总结了相关功能与技术上的进展。
990 0
|
数据采集 JSON 运维
数据加工CheatSheet的使用
数据加工CheatSheet(速查表)提供了一些简单常见的函数场景,本文主要介绍相关背景以及速查表的使用。
259 0