poj_1068的经验

来源:互联网 发布:陌陌推广软件 编辑:程序博客网 时间:2024/04/20 03:05

做这题时,自己把这个问题想复杂了,在纸上找半天的规律,其实可以一步步来做。


#include <iostream>
#include <cstdlib>

using namespace std;
class _parentheses
{
public:
 char direction;
 bool matched;
 int _number;
};

int main(int argc , char* argv[])
{
 

 int sets;
 cin>>sets;

 for(int _i=0 ; _i<sets ; _i++)
 {
  int number;
  cin>>number;
  number*=2;
   _parentheses *_p = new  _parentheses[number+1];
  
  int position;
  int prePosition = 0;
  int lastNum =0;
   int num;
  for (int k=0 ; k<number/2 ; k++)
  {
   
   cin>>num;
   
   if (prePosition==0)
   {
    position = num +1;
    
    
   }
   else if (num > lastNum )
   {
    position = prePosition + 1 + (num-lastNum);
    
   }
   else if (position ==prePosition)
   {
    position = prePosition+1;
   }

 

   for (int j=prePosition+1 ; j<position; j++)
   {
    _p[j].direction = '(';
    _p[j].matched = false;
    
   }


   _p[position].direction = ')';
   _p[position].matched = true;
   _p[position]._number = 0;
   for (int m=position ; m>0 ; m--)
   {
    if (_p[m].direction=='(' )
    {
     _p[position]._number++;
     if ( !_p[m].matched)
     {
      _p[m].matched = true;
      break;
     }
    }
   }
   
   prePosition = position;
   lastNum = num;
  }

  for (int i=1 ; i<=number ; i++)
  {
   if (_p[i].direction == ')')
   {
    cout<<_p[i]._number<<" ";
   }
   
  }
  cout<<endl;

 }
 
 return EXIT_SUCCESS;
 

}

原创粉丝点击