/*题意:有n个矩形,用长和宽表示,如果一个的长和宽都比另一个小,那么这个嵌放在另一个中
所以先对w从大到小排序,w一样的按h从小到大排序,那么就从后面的箱子往前找,只要前面找到一个人h比自己大的就放入c[j]=p[i].h;
否则如果自己的h比前面的都大,那么必定询问到c所存的递增序列的长度+1处,那么个数加1,长度加1,把此事的h放在在c的末端
这个过程和最大递增子序列的找值过程类似,但是并不是求最长递增,只是利用这个过程,所以二分查找稍微有些改变,如果还是按照
最长公共子序列的二分查找,那么h相同的会被覆盖掉比如数据1 1 1 1 2 2 2 2,其中一个2 2会被另一个2 2覆盖掉,导致结果为3*/ #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int w,h;
}p[];
int cmp(const node a,const node b)
{
if(a.w==b.w) return a.h<b.h;
return a.w>b.w;
}
int find(int *p,int len,int n)
{
int l=,r=len;
int mid=(l+r)/;
while(l<=r)
{
if(n>=p[mid]) l=mid+;
else r=mid-;
mid=(l+r)/;
}
/*while(l<=r)//最长递增子序列的二分查找
{
if(n>p[mid]) l=mid+1;
else if(n<p[mid]) r=mid-1;
else return mid;//递增不应许有两个高度一样的,所以要覆盖
mid=(l+r)/2;
}*/
return l;
}
int main()
{
int i,j,k,n,m;
int T;
int c[];
scanf("%d",&T);
while(T--)
{
memset(c,,sizeof(c));
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%d%d",&p[i].w,&p[i].h);
}
sort(p,p+n,cmp);
int len=;
c[]=-;
c[]=p[].h;
for(i=;i<n;i++)
{
j=find(c,len,p[i].h);
c[j]=p[i].h;
if(j==len+) len++;
}
printf("%d\n",len);
}
return ;
}

最新文章

  1. SQL SERVER全面优化-------写出好语句是习惯
  2. 理解 Node.js 里的 process.nextTick()
  3. [make]makefile使用积累
  4. js api 实现钉钉免登
  5. 有关数据库行、锁 的几个问题(rowlock)
  6. lintcode:删除链表中指定元素
  7. asp.net MVC EF Where 过滤条件怎么写
  8. 51nod贪心算法入门-----独木舟问题
  9. 打开PPT 提示安装,非要取消才能显示PPT
  10. ccui.ScrollView 扩展
  11. uiautomatorviewer 识别android微信元素报错
  12. Lambda表达式图解
  13. 自己写的sql server触发器练练--高手请您跳过吧
  14. CodeForces 452C Magic Trick (排列组合)
  15. web添加第三方应用,前端解决跨域问题的8种方案
  16. Yii框架里用grid.CGridView调用pager扩展不显示最后一页按钮的解决
  17. 处理 NCBI taxonomy tree
  18. [转载]PHP中PSR-[0-4]规范
  19. 显示eclipse中Problem窗口的方法
  20. afx_msg解释

热门文章

  1. html input accept类型
  2. ytu 2231: 交集问题(线性表)(数据结构,链表练习)
  3. 修改project任务的默认开始时间
  4. Poj1426
  5. 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树
  6. jquery验证手机号码
  7. FineReport----报表模板入门教程1
  8. 第三课——SQL操作和数据类型
  9. Powershell 脚本调用方法
  10. String.prototype.charCodeAt()