相对于导弹拦截多了一点思考的难度,连线不交叉的最多航行路线,可以想一下先对一边排序
然后在对另外一边LIS。
题目应该在许多网站上都有,codevs,洛谷之类。。
#include<algorithm> #include<iostream> #include<cmath> #include<cstring> #include<string> const int MAXN=50007; using namespace std; int n; struct fzy { int nor,sou; }a[MAXN]; int dp[MAXN],num=0; bool cmp(fzy a,fzy b); void mid_find(int x); int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d%d",&a[i].nor,&a[i].sou); sort(a+1,a+n+1,cmp); num=1; dp[1]=a[1].sou; for (int i=2;i<=n;i++) { mid_find(a[i].sou); } printf("%d",num); } bool cmp(fzy a,fzy b) { return a.nor<b.nor; } void mid_find(int x) { int l=1,r=num,mid; while (l<r) { mid=(l+r)>>1; if (dp[mid]<x) l=mid+1; else r=mid; } if (dp[l]<x) { num++; dp[num]=x; } else dp[l]=x; }