题意:给出n个木头的重量wi,长度li,如果满足w[i+1]>=w[i]且l[i+1]>=l[i],则不用耗费另外的加工时间,问至少需要多长时间加工完这些木头。
第一次做这一题目也没有做出来---而且也是好久以前---于是又看题解了---
发现和将木材按两个关键字(先按重量由大到小排,如果重量相等的话则按长度由大到小排)排序后,和导弹拦截系统是一样的了,求长度的最长上升子序列。
自己写的二分查找一直输不出结果----555555
后来用了题解里面的lower_bound函数
搜了一点lower_bound的用法
和二分查找类似,lower_bound是将一个数a插入到给定的序列[first,end)中第一个不小于a的位置, 如果该序列中所有的数都小于a,那么返回end,a插入到end位置上
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 100005 6 using namespace std; 7 struct node 8 { 9 int l,r; 10 } a[maxn]; 11 int cmp(node n1,node n2) 12 { 13 if(n1.l!=n2.l) return n1.l>n2.l; 14 return n1.r>n2.r; 15 } 16 17 int main() 18 { 19 int ncase,n,i,j,len,tmp,f[maxn]; 20 scanf("%d",&ncase); 21 while(ncase--) 22 { 23 scanf("%d",&n); 24 for(i=1;i<=n;i++) 25 scanf("%d %d",&a[i].l,&a[i].r); 26 sort(a+1,a+n+1,cmp); 27 len=1; 28 f[len]=a[1].r; 29 for(i=2;i<=n;i++) 30 { 31 if(a[i].r>f[len]) 32 { 33 len++; 34 f[len]=a[i].r; 35 } 36 else 37 { 38 tmp=lower_bound(f+1,f+1+len,a[i].r)-f; 39 f[tmp]=a[i].r; 40 } 41 } 42 printf("%d ",len); 43 } 44 }