PKU 1068 模拟

这个题目的思路算是模拟过程吧

题目先翻译一下

让S=s1 s2 s3...s2n表示一串符合规范的括号串(即每个左括号必有一个右括号相对应)。

这样的S能用两种方法来表示(编码):

1。用一个整数序列P=p1p2...pn,其中pi是第i个右括号前的左括号个数

2。用一个整数序列W=w1w2...wn,其中 wi 是从第 i 个右括号往左数直到遇到和它相对应的左括号时经过的左括号个数(包括与第i个右括号相对应的左括号)。

比如:

S  ( ( ( () () () ) ) )

P: 4 5 6 6 6 6

W: 1 1 1 4 5 6

我们的任务就是将一个p序列转化为w序列

输入:

第一个数字t是测试的例子的数目(1<=t<=10)。接下来的是测试例子。每一个例子包含两行数据,第一行是p序列的数字个数,第二行表示的n个数是p序列,每个数字间用空格格开。

输出:由t行组成,每行是一个w序列。



代码如下:
/**********************
Author: WHU_Victordu
Created Time: 2007-12-27
File Name: pku1068.cpp
  Description: 
   **************************/
#include <stdio.h>
#include<string.h>

char qut[41];
int p[21],used[41];

int main()
{
    int t,n,i,tmp,j,k,rightcnt,cnt;
    scanf("%d",&t);
    while(t--)
    {
      scanf("%d",&n);
      for(i=0;i<n;i++)
       scanf("%d",&p[i]);
      
      tmp=0;k=0;
     
      for(i=0;i<n;i++)
      {
        tmp=p[i]-tmp;
        for(j=0;j<tmp;j++)
        {
          qut[k++]='(';
        }
        qut[k++]=')';
        tmp=p[i];     
      }
     
      qut[k++]='\0';
     
      memset(used,0,sizeof(used));
      rightcnt=0;
     
      for(i=0;i<2*n;i++)
      {
        if(qut[i]==')')
        {
          rightcnt++;
          cnt=1;
          for(j=i-1;j>=0;j--)
          {
            if(qut[j]=='('&&!used[j])
            {
              used[j]=1;
              p[rightcnt]=cnt;
              break;
            }
            else if(qut[j]==')')
            cnt++;
          }
        }
      }
     
      for(i=1;i<n;i++)
       printf("%d ",p[i]);
      
       printf("%d\n",p[n]);
           
    }
}

 

posted on 2007-12-27 23:40 Victordu 阅读(891) 评论(1)  编辑 收藏 引用

评论

# re: PKU 1068 模拟 2009-07-16 09:17 Mr.Knight

我的代码超时…我再改。
谢谢楼主分享!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

常用链接

留言簿(5)

随笔档案(46)

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜