POJ 1068

POJ 1068

http://acm.pku.edu.cn/JudgeOnline/problem?id=1068
这道题目是一道模拟题。P-sequence表示第i个‘)’之前有几个‘(’,W-sequence表示第i个‘()’包含几对‘()’,要求对应P的W。题目中没有要输出S,故‘(’‘)’可以分别用0,1来代替。根据P可以轻易知道‘)’的位置:location = p[i] + i。用value记录w[i]的值,用flag记录括号是否成对。
 1  #include < stdio.h >
 2  #include < string .h >
 3  #include < stdlib.h >
 4  int  t,n;
 5  int  s[ 41 ],p[ 21 ],w[ 21 ];
 6  int  main()
 7  {
 8      scanf( " %d " , & t);
 9       while (t -- ){
10          scanf( " %d " , & n);
11           int  temp,flag,value;
12          memset(s, 0 , sizeof (s));
13           for ( int  i  =   0 ;i  <  n; ++ i){
14              scanf( " %d " , & p[i]);
15              temp  =  p[i]  +  i;
16              s[temp]  =   1 ;
17               for ( int  k  =  temp - 1 ,value  =   1 ,flag  =   0 ;k  >=   0 ; -- k){
18                   if (s[k]  ==   0   &&  flag  ==   0 ){
19                      w[i]  =  value;
20                       break ;
21                  }
22                   else   if (s[k]  ==   1 ){
23                      value ++ ;
24                      flag ++ ;
25                  }
26                   else   if (s[k]  ==   0 )flag -- ;
27              }
28          }
29           for ( int  i  =   0 ;i  <  n; ++ i)printf( " %d  " ,w[i]);
30          printf( " \n " );
31      }
32      system( " pause " );
33       return   0 ;
34  }
35 
code

你可能感兴趣的:(POJ 1068)