Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2643 Accepted Submission(s): 785
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; struct Doll{ int w,h; }d[20005]; int tt,n,f[20005]; bool cmp(Doll a, Doll b) { if(a.w==b.w) return(a.h>b.h); else return(a.w<b.w); } int LIS() { int ftmp[20005];//长度为i的最小的一个数 memset(ftmp,0,sizeof(ftmp)); int tail=0; ftmp[0]=0; for(int i=0; i<n; i++) { int l=0,r=tail; while(l<r-1) { int mid=(l+r)/2; if(ftmp[mid]<=d[i].h) l=mid; else r=mid; } if(ftmp[r]<=d[i].h) l=r; if(ftmp[l]<=d[i].h) ftmp[l+1]=d[i].h; if(l==tail) tail++; } return tail; } int main() { scanf("%d",&tt); while(tt--) { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d%d",&d[i].w,&d[i].h); sort(d,d+n,cmp); reverse(d,d+n); printf("%d\n",LIS()); } return 0; }
有Algorithm:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; struct Doll{ int w,h; }d[20005]; int tt,n,f[20005]; bool cmp(Doll a, Doll b) { if(a.w==b.w) return(a.h>b.h); else return(a.w<b.w); } int LIS() { vector<int> ftmp;//长度为i的最小的一个数 for(int i=0; i<n; i++) { vector<int>::iterator it=upper_bound(ftmp.begin(),ftmp.end(),d[i].h); if(it!=ftmp.end()) *it=d[i].h; else ftmp.push_back(d[i].h); } return ftmp.size(); } int main() { scanf("%d",&tt); while(tt--) { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d%d",&d[i].w,&d[i].h); sort(d,d+n,cmp); reverse(d,d+n); printf("%d\n",LIS()); } return 0; }
要注意的是 <algorithm>中
upper_bound()表示在有序数列中找到第一个>val的iterator
lower_bound()表示在有序数列中找到第一个>=val的iterator
原文:http://www.cnblogs.com/Mathics/p/3896032.html