洛谷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分钟: 如果刚处理 ...
随机推荐
- VBox 一款基于vue开发的音乐盒 序章
己基于vue写了一个 Mplayer, github地址:https://github.com/xiangwenhu/MPlaer, 演示地址:http://babydairy2017.cloudap ...
- Anaconda使用
转自PeterYuan 序 Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python, ...
- jQuery实现移动端评测问卷功能
效果图: 需求: 1.有10道测试题目,单选,选中答案之后,500ms后自动跳转至下一题 2.如果当前题目没有选择答案,将弹窗提示"请选择答案!" 3.点击"上一题&qu ...
- linux中使用Python IDE pycharm教程
今天使用vim编辑Python 并在linux中终端调试的时候,发现每次不是自己想要输出结果的时候,就要用vim编辑代码,再重新回到终端,比较浪费时间.搜索发现pycharm这一个Python ide ...
- 将linux下的office从libreoffice换成wps
1.下载wps的linux的deb版本 2.运行dpkg -i wpsXXX.deb 3.提示权限不够 4.运行 sudo dpkg -i wpsXXX.deb 5.提示错误 未安装软件包 libpn ...
- ajax跨站请求伪造
用ajax提交数据到后台: {#<!DOCTYPE html>#} <html lang="en"> <head> <meta chars ...
- C++面向对象作业1
#include <iostream> #include <stdlib.h> using namespace std; class Tdate { public: Tdate ...
- c语言基础学习08_关于内存管理的复习
=============================================================================对于c语言来讲,内存管理是一个很重要的内容,它 ...
- jquery实现上下滑动选择
$('.rightShow').on('mousewheel', function(ev) { var dir = ev.originalEvent.wheelDelta if(dir == 120) ...
- springboot注解使用说明
springboot注解 @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(ster ...