zoukankan      html  css  js  c++  java
  • Codeforces:Least Cost Bracket Sequence

    Codeforces:Least Cost Bracket Sequence

    题目链接:http://codeforces.com/contest/3/problem/D

    题目大意:给出一个仅包含'(',')','?'的字符串,现要求将所有'?'替换成'('或')'使得所有括号匹配,将第i个'?'换成'('的代价为ai,换成')'的代价为bi,问最小代价.

    贪心

    拿到题目自然而然想到动态规划的做法,然而其复杂度O(n2)不满足题意.

    我们发现当i<j,若子字符串substr(1,i)不满足匹配,则substr(1,j)不满足匹配.

    故可以考虑先将s中所有'?'替换成')',得到一个仅含'('和')'的字符串s'.

    然后从左边开始检查substr(1,i)是否满足匹配,若不满足匹配则将{s'[x]|1≤x≤i且s[x]='?'}中任意一个替换成'('即可使substr(1,i)重新满足匹配.

    选择priority_queue维护代价min{value[x]|1≤x≤i且s[x]='?'},时间复杂度为O(nlgn)

    /*strlen(char *s)的复杂度为O(n)*/

    代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #define N 50005
     6 using namespace std;
     7 char s[N];
     8 int a[N][2],m,num,k,f[N],len;
     9 bool Left[N],flag=1;
    10 struct node{
    11     int id,v;
    12     node(int _id=-1,int _v=-1){
    13         id=_id;v=_v;
    14     }
    15     friend bool operator < (node a,node b){
    16         return a.v<b.v;
    17     }
    18 };
    19 priority_queue<node>q;
    20 int main(void){
    21     scanf("%s",s);
    22     len=strlen(s);
    23     for(int i=0;i<len;++i)
    24         if(s[i]=='?')f[i]=m++;
    25     for(int i=0;i<m;++i)
    26         scanf("%d%d",&a[i][0],&a[i][1]);
    27     for(int i=0;i<len;++i){
    28         if(s[i]=='(')num++;
    29         else if(s[i]==')')num--;
    30         else if(s[i]=='?'){
    31             num--;
    32             q.push(node(i,a[f[i]][1]-a[f[i]][0]));
    33         }
    34         if(num<0){
    35             if(q.empty()){
    36                 flag=0;
    37                 break;
    38             }else{
    39                 node t=q.top();q.pop();
    40                 Left[t.id]=1;
    41                 num+=2;
    42             }
    43         }
    44     }
    45     if(flag&&num==0){
    46         long long ans=0;
    47         for(int i=0;i<len;++i){
    48             if(s[i]=='?'){
    49                 if(Left[i]){
    50                     ans+=a[f[i]][0];
    51                     s[i]='(';
    52                 }else{
    53                     ans+=a[f[i]][1];
    54                     s[i]=')';
    55                 }
    56             }
    57         }
    58         printf("%I64d
    %s",ans,s);
    59     }else printf("-1");
    60 }

     /*若在

    q.push(node(i,a[f[i]][1]-a[f[i]][0]));

    前添加

    string test;

    则会出现segmentation fault,没有发现相关资料。

    ac后上stackoverflow提问,结果复现不出来了:(

    */

  • 相关阅读:
    win10 L2TP拨号
    Esxi直通板载Sata
    Esxi 增加网卡驱动 生成ISO
    IPMITOOL THRESHOLD 修改
    Reverse Engineering Supermicro IPMI
    Esxi通过RDM直通硬盘
    Centos 安装后优化
    Centos 6安装apache 2.4
    Try Catch Finally 中Finally的代码在什么时候不被执行
    用CutePDF AND GhostScript 生成PDF的处理流
  • 原文地址:https://www.cnblogs.com/barrier/p/6430946.html
Copyright © 2011-2022 走看看