Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
给runtime error的同学们一点参考我的算法应该很一般 我之所以会RE是因为我每个malloc之前都没有+1,加上就AC了 /*思路是这样的,先根据第一种形式得到括号序列的表示,0是 左括号,1是右括号。然后从序列最右端开始检测,遇到右括号countR就 增加,遇到左括号countL就增加并且递减一次countR,知道countR等于 0的时候意味着找到匹配的左括号,输出*/ #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); int *p = (int *)malloc(sizeof(int)*(n+1)); int *w = (int *)malloc(sizeof(int)*(n+1)); for(int i=0;i<n;i++) scanf("%d",&p[i]); int *map = (int *)malloc(sizeof(int)*(p[n-1]*2+1)); for(int i=0;i<2*p[n-1];i++){ map[i] = 3; w[i] = 0; } for(int i=0;i<n;i++){ for(int j=0;j<2*p[i];j++){ if(map[j] == 3){ map[j] = 0; } } map[p[i]+i] = 1; } int mark = 2*p[n-1]-1; for(int i=n-1;i>=0;i--){ int countL=0,countR = 0; for(int j=mark;j>=0;){ if(map[j]) countR++; else{ countL++; countR--; } j--; if(!countR){ w[i] = countL; for(int k=mark-1;k>=0;k--) if(map[k]){ mark = k; break; } break; } } } for(int i=0;i<n;i++) printf("%d ",w[i]); printf("\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator