戳这里看原题


主要思路:

这道题一眼看过去就可以贪心。。

首先可以按L排序。。

显然排序之后我们就可以抛开L不管了。。

然后就可以愉快的贪心了。。


细节:

这道题可以看成用 最少的合法序列(详见原题) 装下所有木棍。。

可以考虑用一种数据结构来记录序列最末端的木棍。。

可以考虑先按上述思路排序,

然后每次加木棍时加在第一个大于等于当前木棍宽度的木棍的序列末端,

然后顶替掉找到的这一位。

如果找不到这样的木棍就再开一个序列。。 (本题贪心的核心思想)

然而我懒得多动手,就用了STL的set来维护每个序列的末端木棍的宽度。。

set是C++中自带的红黑树(二叉平衡树),可以很方便地查找、插入和删除。

时间复杂度都是log级别。。

显然时间复杂度O(nlogn), 空间复杂度O(n)

剩下就是代码的事了。。(带注释):

 #include <bits/stdc++.h>
using namespace std;
const int N = ;
int n, ans;
struct P {
int a, b;
friend bool operator < (P x, P y) { //set套结构体要重载<运算符
return x.b < y.b;
}
}s[N + ];
bool cmp(P x, P y) { //将木棍按长度排序
if(x.a != y.a) return x.a > y.a;
return x.b > y.b;
}
set<P>a;
set<P>::iterator it; //定义一个set<P>的迭代器
int main() {
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d%d", &s[i].a, &s[i].b);
sort(s + , s + + n, cmp); //按照长度排序
for(int i = ; i <= n; i++) {
if(a.empty()) a.insert(s[i]), ans++; //一定要这一步,不然没有元素时直接lower_bound会RE
else {
it = a.lower_bound(s[i]); //用lower_bound找到第一个大于等于当前木棍宽度的木棍
if(it == a.end()) a.insert(s[i]), ans++; //没有这样的木棍就再开一个序列
else a.erase(it), a.insert(s[i]); //否则就不用开,然后把这个木棍顶替掉之前这个序列的末尾木棍
}
}
printf("%d\n", ans); //输出答案(实际上就是a.size())
return ;
}

洛谷P1233 [木棍加工]的更多相关文章

  1. 洛谷 P1233 木棍加工 解题报告

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  2. 洛谷P1233 木棍加工【单调栈】

    题目:https://www.luogu.org/problemnew/show/P1233 题意: 有n根木棍,每根木棍有长度和宽度. 现在要求按某种顺序加工木棍,如果前一根木棍的长度和宽度都大于现 ...

  3. 洛谷 P1233 木棍加工

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...

  4. 洛谷P1233 木棍加工题解 LIS

    突然发现自己把原来学的LIS都忘完了,正好碰见这一道题.|-_-| \(LIS\),也就是最长上升子序列,也就是序列中元素严格单调递增,这个东西有\(n^{2}\)和\(nlog_{2}n\)两种算法 ...

  5. 洛谷 P1233 木棍加工 题解

    题面 Dilworth定理:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度. 反链是一种偏序集,其任意两个元素不可比:而链则是一种任意两个元 ...

  6. 「洛谷P1233」木棍加工 解题报告

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  7. P1233 木棍加工

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  8. P1233木棍加工

    这个题被算法标签标为DP,但其实可能只是用dp求子序列,,(n方) 给出l与w,只要是l与w同时满足小于一个l与w,那么这个木棍不需要时间,反之需要1.看到这个题,首先想到了二维背包,然后发现没有最大 ...

  9. P1233 木棍加工 dp LIS

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...

随机推荐

  1. Java多线程窥探

    1.程序,进程,线程 标准定义:

  2. Wing IDE设置(自动补全&注释快捷键)

    自动补全(默认使用Tab键自动补全) 修改方法:edit  -> preferences -> Editor -> Auto-completion 把右边keys的地方,从tab改成 ...

  3. 【扩展欧几里得】NOIP2012同余方程

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

  4. Android基础_web通信

    一.发展史 1G 模拟制式手机,只能进行语音通话2G 数字制式手机,增加接收数据等功能3G 智能手机,它已经成了集语音通信和多媒体通信相结合,并且包括图像.音乐.网页浏览.电话会议以及其它一些信息服务 ...

  5. PHP面向对象编程基本原则

    首先祝大家节日快乐!!! 额,不知道你们剁手没,小梦是没有!整整已经错过了第九个年头! 小伙伴是不是有一种感觉,PHP入门的时候简直爱不释手,总是把 "PHP是世界上最好的语言" ...

  6. 详解zkw算法解决最小费用流问题

    网络流的一些基本概念 很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本的概念反而说不清楚. 虽然不同的模型在具体叫法上可能不相同, 但是不同叫法对应的思想是一致的. 下面的讨论力求规 ...

  7. [51nod1425]减减数

    初始给定一个整数n.每次可以对其做一个操作,这个操作是将n减去他其中的某一位.得到新的一个数字n',然后继续操作,直到他变成0为止. 比如24这个例子,24 → 20 → 18 → 10 → 9 → ...

  8. UVa 10341 - Solve It【经典二分,单调性求解】

    原题: Solve the equation:         p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0         where  ...

  9. BZOJ1078: [SCOI2008]斜堆

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 每一次进入的点一定是一个极左节点,然后将它所处在的整棵树左右翻转.加上一些情况的处理. ...

  10. map映照容器的使用

    map映照容器可以实现各种不同类型数据的对应关系,有着类似学号表的功能. 今天在做并查集的训练时,就用上了map映照容器. 题目就不上了,直接讲一下用法.顺便说一下,实现过程是在C++的条件下. #i ...