无情的一题!!!
读了半小时题,才把题目看懂,发现是LIS后写了二分的那种方法,node[i]向ans[i]赋值的时候len++了两次,样例跑不出来,从机房走出去看见一只小猫,回来就发现了bug
=。=
结果一提交,RE,检查发现n最大10000我开的22222,没开小,百度里面看到有人也用这个方法提交后也是RE。。。自己出了几组数据后发现貌似不能用二分写呢(至少我还没想到该怎么改,看到后知道怎么改的筒子请私信=。=)
下面是RE二分代码
#include <iostream> #include<stdio.h> #include<string> #include<cstring> #include<algorithm> #include<cmath> #define N 10010 using namespace std; struct Node { int x,y; }node[N]; struct Ans { int x,y; }ans[N]; int len; int binary_search(int i) { int le,ri,mid; le=1;ri=len; while(le<=ri) { mid=(ri+le)/2; if(node[i].x<=ans[mid].x&&node[i].y<=ans[mid].y) ri=mid; else le=mid+1; } return le; } int cmp(Node a,Node b) { if(a.x==b.x) return a.y<=b.y; else return a.x<b.x; } int main() { int n; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) { scanf("%d %d",&node[i].x,&node[i].y); } sort(node+1,node+1+n,cmp); ans[1].x=node[1].x; ans[1].y=node[1].y; len=1; for(int i=2;i<=n;i++) { if(node[i].x>=ans[len].x&&node[i].y>=ans[len].y) { len++; ans[len].x=node[i].x; ans[len].y=node[i].y; } else { int pos=binary_search(i); ans[pos].x=node[i].x; ans[pos].y=node[i].y; } } cout<<"-----------"<<endl; for(int i=1;i<=n;i++) { printf("%d %d\n",node[i].x,node[i].y); } cout<<"------------"<<endl; for(int i=1;i<=len;i++) cout<<ans[i].x<<" "<<ans[i].y<<endl; //printf("%d\n",len); } printf("*\n"); return 0; }
/* 5 1 1 2 6 3 3 4 2 5 5 5 1 1 2 6 4 4 3 8 5 3 */
其实l和m给的范围蛮小的,只有100,换方法喽
<pre name="code" class="cpp">#include<stdio.h> #include<string> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #define N 22222 using namespace std; int dp[110][110]; struct Node { int x,y; }node[N]; int main() { int n; while(~scanf("%d",&n)) { if(n==0)break; memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) { scanf("%d %d",&node[i].x,&node[i].y); dp[node[i].x][node[i].y]++; } for(int i=1;i<=100;i++) for(int j=1;j<=100;j++) { dp[i][j]+=max(dp[i][j-1],dp[i-1][j]); } int ans=0; for(int i=1;i<=n;i++) { if(dp[node[i].x][node[i].y]>ans) ans=dp[node[i].x][node[i].y]; } printf("%d\n",ans); } printf("*\n"); return 0; }