题目链接: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; }