题不是很难,但不知道怎么。。。请教下面两个代码有什么不同吗?为什么一个可以A,一个却是WA。
AC:
#include<stdio.h> #include<string.h> #define MAXD 70000 int N, P, Q, s[MAXD], r[MAXD]; void solve() { int i, j, p, q, top, mid, max, min; scanf("%d%d%d", &N, &P, &Q); memset(r, 0, sizeof(r)); for(i = 1; i <= P+1; i ++) { scanf("%d", &p); r[p] = i; } s[0] = top = 0; for(i = 1; i <= Q+1; i ++) { scanf("%d", &p); q = r[p];printf("q=%d\n",q); if(!q) continue; if(q > s[top]) s[++ top] = q; else { max = top; min = 0; for(;;) { mid = (max + min) / 2; if(mid == min) break; if(s[mid] < q) min = mid; else max = mid; } s[mid + 1] = q; } } printf("%d\n", top); } int main() { int t, tt; scanf("%d", &t); for(tt = 0; tt < t; tt ++) { printf("Case %d: ", tt + 1); solve(); } getchar(); getchar(); return 0; }
WA:
#include<stdio.h> #include<string.h> #define MAXN 70000 int ap[MAXN], aq[MAXN], aso[MAXN], f[MAXN]; int t, p, q, n, num; void solve() { int top = 0; f[0] = 0; for(int i = 1; i <= p+1; i ++) { if(!aso[i]) continue; if(aso[i] > f[top]) {top ++; f[top] = aso[i];} else { int x = 0, y = top, mid; if(top == 0) f[0] = aso[i]; while(x < y) { mid = x +(y-x)/2; if(x == mid) break; if(f[mid] < aso[i]) x = mid; else y = mid; } f[mid+1] = aso[i]; } //for(int j = 0; j <= top; j ++) //printf("j= %d f[j]=%d\n",j ,f[j]); } printf("Case %d: %d\n",num ++, top+1); } int main() { scanf("%d",&t); num = 1; while(t --) { scanf("%d%d%d",&n, &p, &q); memset(ap, 0,sizeof(ap)); printf("1\n"); for(int i = 1; i <= p+1; i ++) { int x; scanf("%d",&x); ap[x] = i; } for(int i = 1; i <= q+1; i ++) scanf("%d",&aq[i]); for(int i = 1; i <= q+1; i ++) {aso[i] = ap[aq[i]];} solve(); } return 0; }