Description

有N根木棍等待处理。机器在处理第一根木棍时需要准备1分钟,此后遇到长宽都不大于前一根木棍的木棍就不需要时间准备,反之则需要1分钟重新准备。比如木棍按照(3,3)、(1,3)、(1,4)、(2,3)的顺序进入,共需要准备3分钟

Input

第一行是T,表示测试数据个数。测试数据的第一行是N(1 <= N <= 5000)此后一行是 l1 , w1 , l2 , w2 ,..., ln , wn......长宽都小于10000

Output

每个一行,表示最短准备时间

Sample Input

3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1
Sample Output
2
1
3
Analysis
这道题目要求我们关注两个维度,也就是长和宽,如果两个方面同时DP会有困难
我们试想能不能在一维度已经最优(从大到小排序)的情况下去计算二维度产生的影响?
如何证明其正确性?
1.当调整一个值后能 减弱第二维度的影响 而会 增加第一维度的影响 ,这样对答案是没有影响的
2.当调整一个值后能 减弱第二维度的影响 而会 对第一维度没有影响 ,这样可以在排序时以第一维度为关键字排序时同时以第二维度为关键字消除这种情况
3.当调整一个值后能 减弱第二维度的影响 同时 减弱第一维度的影响 ,不存在的,第一维度已经最优了
综上所属,这种办法是成立的
如何统计第二维度的影响?
我们想起了导弹拦截那到题,加强版第二问求最少要多少导弹都打下来,也就是求最长上升序列(严谨证明不在此赘述),那这道题也就是一样的了。
有一份简短的STL代码:
  对于最长上升/下降序列,请使用lower_bound(),在第一个大于等于此数(记做a)的地
方覆\盖成这个较小(相等)的数(记做b),因为如果之后插入的数在大于b小于a,不覆盖时插
不进来,覆盖后就能插入,这样能保证更优。最后看序列长度就是最长上升序列(如需下降序
列请反转) 对于最长不上升/下降:请使用upper_bound(),在第一个大于此数的地方覆盖成这个较小的
数,这样相比上面的情况,就能保留相同的数字,从而实现不上升/下
Code:
 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define maxn 5005
using namespace std;
int T,n;
int dp[maxn];
struct D{
int x,y;
inline int operator < (const D &a)const{
return (x==a.x?y>a.y:x>a.x);
}
}p[maxn];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void work()
{
fill(dp,dp+n,inf);
rep(i,,n) *lower_bound(dp,dp+n,p[i].y)=p[i].y;
printf("%d\n",lower_bound(dp,dp+n,inf)-dp);
} int main()
{
T=read();
while(T--)
{
n=read();
rep(i,,n) p[i].x=read(),p[i].y=read();
sort(p+,p++n);
work();
}
return ;
}

最新文章

  1. 隐式的bean发现与自动装配机制
  2. 关于前期在云服务器上部署TOMCAT服务器的问题
  3. SQLSERVER中按年月分组
  4. python学习笔记21(正则表达式)
  5. AWVS介绍
  6. 关于在MDK4.5以上版本不能使用JLINK V8的解决办法
  7. 2017-2-19 C#基础 基本数据类型的转换,转义字符,常量
  8. 利用echo命令实现倒计时的功能
  9. js代码性能优化的几个方法
  10. MySQL 批量写入数据报错:mysql_query:Lost connection to MySQL server during query
  11. 21、bootstrap框架
  12. Flutter学习笔记与整合
  13. JDBC和hibernate,mybatis的比较
  14. oracle的loop等循环语句的几个用法小例子
  15. 【IDEA】【3】操作使用
  16. GitHub学习三-远程版本库更新与提交
  17. 内心的平静就是财富本身-Cell组件-用友华表的由来-T君
  18. Linux:file命令显示自定义文件类型
  19. Redis学习第二课:Redis String类型及操作
  20. http之url和uri

热门文章

  1. Chrome开发者控制台操作教程
  2. Echo()、print()、print_r()区别
  3. Java生成生成密码类
  4. 使用docker方式安装etcd集群,带TLS证书
  5. console输出彩色字体
  6. MyBatis的Mapper接口以及Example的实例函数及详解
  7. SQL Server生成数据库的数据字典存储过程
  8. 12px以下字体显示问题
  9. HDU4779 Tower Defense 组合数学
  10. 【python】异步IO