HDU 1051 Wooden Sticks【LIS】

题意:给出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\n",len);

43     }    

44 }
View Code

 

你可能感兴趣的:(HDU)