洛谷P1233 [木棍加工]
主要思路:
这道题一眼看过去就可以贪心。。
首先可以按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 [木棍加工]的更多相关文章
- 洛谷 P1233 木棍加工 解题报告
P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...
- 洛谷P1233 木棍加工【单调栈】
题目:https://www.luogu.org/problemnew/show/P1233 题意: 有n根木棍,每根木棍有长度和宽度. 现在要求按某种顺序加工木棍,如果前一根木棍的长度和宽度都大于现 ...
- 洛谷 P1233 木棍加工
题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...
- 洛谷P1233 木棍加工题解 LIS
突然发现自己把原来学的LIS都忘完了,正好碰见这一道题.|-_-| \(LIS\),也就是最长上升子序列,也就是序列中元素严格单调递增,这个东西有\(n^{2}\)和\(nlog_{2}n\)两种算法 ...
- 洛谷 P1233 木棍加工 题解
题面 Dilworth定理:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度. 反链是一种偏序集,其任意两个元素不可比:而链则是一种任意两个元 ...
- 「洛谷P1233」木棍加工 解题报告
P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...
- P1233 木棍加工
P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...
- P1233木棍加工
这个题被算法标签标为DP,但其实可能只是用dp求子序列,,(n方) 给出l与w,只要是l与w同时满足小于一个l与w,那么这个木棍不需要时间,反之需要1.看到这个题,首先想到了二维背包,然后发现没有最大 ...
- P1233 木棍加工 dp LIS
题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...
随机推荐
- IOS10.3上传照片只能拍照不能选择解决办法
升级IOS10.3正式版以后可能会出现上传文件的控件只能拍照而不能选择现有图片的问题. 正好被我们碰到了,于是找了找解决思路,发现如下解决思路: 原代码为: <input type=" ...
- python3之模块collections
1.计数器(counter) counter是对字典的方法,用来追踪值的出现次数:具备字典的所有功能和自己的功能. >>> from collections import Count ...
- C# war3 巨魔精灵 minimap
弃坑LOL后,无聊的时候玩玩 war3的RPG地图,巨魔与精灵. 玩了一段时间精灵....然后玩魔结果总是找不到人.所以就有了这个想法. 代码纯粹靠搬运. 说下原理,网上有份代码,可以查看当前选中目 ...
- windows编程学习笔记(三)ListBox的使用方法
ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,Lis ...
- Jerry的CDS view自学系列
My CDS view self study tutorial - part 1 how to test odata service generated by CDS view https://blo ...
- [PHP] PHP源码中的条件编译定义
根据不同情况编译不同代码.产生不同目标文件的机制,称为条件编译有这些预处理命令:#if.#elif.#else #endif :#ifdef #else #endif PHP源码: #ifdef SE ...
- SVM公式推导笔记
参考资料: 对偶函数-http://blog.pluskid.org/?p=702 KTT和拉格朗日乘子-http://www.cnblogs.com/zhangchaoyang/articles/2 ...
- DOM拓展表格小练习
涉及的知识点 DOM操作HTML页面.DOM操控表格.一些基本的事件.遍历知识.数组字符串知识.函数的作用域知识 效果图 html代码 <body><div id="con ...
- 跨浏览器开发:CSS
理解CSS盒子模型 如果不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码,透彻地理解 CSS 盒子模型是首要事情,CSS 盒子模型并不难,且基本支持所有浏览器,除了某些特定条件下的 IE 浏览器.CS ...
- 【批处理学习笔记】第十四课:常用DOS命令(4)
系统管理at 安排在特定日期和时间运行命令和程序shutdown立即或定时关机或重启taskkill结束进程(WinXPHome版中无该命令)tasklist显示进程列表(Windows XP Hom ...