zoukankan      html  css  js  c++  java
  • 模拟 POJ 1068 Parencodings

    题目地址:http://poj.org/problem?id=1068

     1 /*
     2     题意:给出每个右括号前的左括号总数(P序列),输出每对括号里的(包括自身)右括号总数(W序列)
     3     模拟题:无算法,s数组把左括号记为-1,右括号记为1,然后对于每个右括号,numl记录之前的左括号
     4             numr记录之前的右括号,sum累加s[i]的值,当sum == 0,并且s[i]是左括号(一对括号)结束,记录b[]记录numl的值即为答案
     5     我当时题目没读懂,浪费很长时间。另外,可以用vector存储括号,还原字符串本来的样子
     6 */
     7 #include <cstdio>
     8 #include <iostream>
     9 #include <algorithm>
    10 #include <cstring>
    11 #include <cmath>
    12 #include <string>
    13 #include <map>
    14 #include <queue>
    15 #include <vector>
    16 using namespace std;
    17 
    18 const int MAXN = 100 + 10;
    19 const int INF = 0x3f3f3f3f;
    20 int a[MAXN];
    21 int b[MAXN];
    22 int s[1000];
    23 
    24 void work(int n)
    25 {
    26     memset (s, 0, sizeof (s));
    27 
    28     int k = a[1];
    29     for (int i=1; i<=k; ++i)    s[i] = -1;
    30     s[++k] = 1;
    31     
    32     int cnt;
    33     for (int i=2; i<=n; ++i)
    34     {
    35         cnt = a[i] - a[i-1];
    36         for (int j=k+1; j<=k+1+cnt; ++j)
    37         {
    38             s[j] = -1;
    39         }
    40         k += cnt;
    41         s[++k] = 1;
    42     }
    43     int t = 0;
    44     for (int i=1; i<=k; ++i)
    45     {
    46         if (s[i] == 1)
    47         {
    48             int sum = s[i];
    49             int numl = 0, numr = 0;
    50             for (int j=i-1; j>=1; --j)
    51             {
    52                 if (s[j] == 1)    numr++;
    53                 else    numl++;
    54                 sum += s[j];
    55                 if (sum == 0)
    56                 {
    57                     b[++t] = numl;    break;
    58                 }
    59             }
    60         }
    61     }
    62     int first = 1;
    63     for (int i=1; i<=t; ++i)
    64     {
    65         if (first)
    66         {
    67             cout << b[i];    first = 0;
    68         }
    69         else    cout << " " << b[i];
    70     }
    71     cout << endl;
    72 }
    73 
    74 int main(void)        //POJ 1068 Parencodings
    75 {
    76     //freopen ("F.in", "r", stdin);
    77 
    78     int t;
    79     cin >> t;
    80     while (t--)
    81     {
    82         int n;
    83         cin >> n;
    84         for (int i=1; i<=n; ++i)    cin >> a[i];
    85 
    86         work (n);
    87     }
    88 
    89     return 0;
    90 }
    编译人生,运行世界!
  • 相关阅读:
    路径操作OS模块和Path类(全)一篇够用!
    数据可视化:绘图库-Matplotlib
    matplotlib中文显示的问题
    Microsoft Visual C++ 14.0 is required问题解决
    python习题——随机整数生成类
    python——时间模块
    怎么获取10个线程的结果再返回
    集群服务器定时任务,只运行一个定时器的设计
    分布式事务
    分布式数据库---分库分表
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4372485.html
Copyright © 2011-2022 走看看