cf-Round551-Div2-C. Serval and Parenthesis Sequence(贪心)

题目链接:http://codeforces.com/contest/1153/problem/C

题意:给定由'(',')','?'组成的字符串,问是否能将其中的?全部换成'(‘,’)'使得字符串的任意非空真字串不构成正确的括号表达式,而整个字符串构成括号表达式,其中正确的括号表达式是指通过插入'1','+'能构成算术式。

思路:我们记'('为-1,')'为1,显然所有字串应满足前面的和<0,字串等于0的话就不满足字串不构成正确的括号表达式了,且整个字符串的和=0(题目可能出现'((((??'这样的数据,即无法构成正确的括号表达式的。我们用n1表示需要添加的'('的数量,n2表示要添加的')'的数量,利用贪心思想,将前n1个?全部换成'(',将剩下的?全换成')’。然后从头检查一遍即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;

int n,n1,n2,flag=1;
char s[300005];

int main(){
    scanf("%d",&n);
    if(n%2==1){
        printf(":(\n");
        return 0;
    }
    scanf("%s",s);
    for(int i=0;i<n;++i)
        if(s[i]=='(') ++n1;
        else if(s[i]==')') ++n2;
    n1=n/2-n1,n2=n/2-n2;
    int k=0;
    for(int i=0;i<n1;)
        if(s[k++]=='?') s[k-1]='(',++i;
    for(int i=0;i<n2;)
        if(s[k++]=='?') s[k-1]=')',++i;
    int tmp=0;
    for(int i=0;i<n-1;++i){
        if(s[i]=='(') --tmp;
        else ++tmp;
        if(tmp>=0){
            flag=0;
            break;
        }
    }
    if(s[n-1]=='(') --tmp;
    else ++tmp;
    if(tmp!=0) flag=0;
    if(flag)
        printf("%s\n",s);
    else 
        printf(":(\n");
    return 0;
}

 

posted @ 2019-04-14 11:59  Frank__Chen  阅读(417)  评论(0编辑  收藏  举报