Chinaunix首页 | 论坛 | 博客
  • 博客访问: 481957
  • 博文数量: 59
  • 博客积分: 345
  • 博客等级: 二等列兵
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-18 22:44
个人简介

to be myself

文章分类

全部博文(59)

文章存档

2017年(5)

2013年(47)

2012年(3)

2011年(4)

分类: C/C++

2013-03-02 18:18:26

Problem: 1068 User: angrad 
Memory: 136K Time: 0MS 
Language: C Result: Accepted 

题意:p数组的意思是每个数字所在处及其前面有多少个左括号。
    而w数组的意思是数字所在位置的右括号能和左边的第几个左括号匹配 
如S            (((()()())))
P-sequence       4 5 6666
W-sequence       1 1 1456
由P求w只需找到另一个数组存储每个右括号前面有多少个左括号,我这里用a数组表示
则       a应该为 4 1 1000
a[i+1] =p[i+1] - [pi];(i=-1, 0, 1, ...n-2)code中我直接用到两个临时变量temp1,temp2在输入P的时候就换好了。
标记b数组,为0表示未配对的右括号,根据a中每个对应它前面的左括号数来计算并存入b数组。
a、b数组的变化, x为当前位置 
---------     ---------     ---------  ---------  ---------  --------- ---------
a:411000     a: 311000     a: 301000  a: 300000  a: 200000  a: 100000 a: 000000
                 x              x           x           x           x          x 
b:000000      b: 100000      b: 110000   b: 111000   b: 111400   b: 111450  b: 111456

---------     ---------     ---------  ---------  ---------  --------- ---------  


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define MAX 20

  4. int main()
  5. {
  6.    int t,n, i, j, a[MAX],b[MAX], temp1, temp2;
  7.    scanf("%d", &t);
  8.    while(t--)
  9.    {
  10.        scanf("%d", &n);
  11.        temp1 = 0;
  12.        memset(a, 0, sizeof(a));
  13.        memset(b, 0, sizeof(b));
  14.        for(i=0;i<n;i++)
  15.        {
  16.            scanf("%d", &a[i]);
  17.            //输入的同时直接改变a数组
  18.            temp2 = a[i];
  19.            a[i] -= temp1;
  20.            temp1 = temp2;
  21.        }
  22.        
  23.        for(i=0;i<n;i++)
  24.        {
  25.            if(!b[i])
  26.            {
  27.                if(a[i] > 0)
  28.                {
  29.                    a[i]--;
  30.                     b[i] = 1;
  31.                }
  32.                else
  33.                {
  34.                     b[i] = 1; //b[i]左移找左括号,从1计数
  35.                    j = i;
  36.                    while(!a[--j])
  37.                    {
  38.                         b[i]++;
  39.                    }
  40.                     b[i]++;
  41.                    a[j]--;
  42.                }
  43.            }
  44.        }
  45.        //避免输出多余空格,先输出b[0]
  46.        printf("%d",b[0]);
  47.        i = 1;
  48.        while(i <n)
  49.        {
  50.            printf(" %d",b[i++]);
  51.        }
  52.        printf("n");
  53.    }
  54.    
  55.    return 0;
  56. }

2011-03-31 14:48 发表于百度空间,今搬至CU。

阅读(3435) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~