做资料网站是自己建服务器好还是租用好,惠州百度seo排名,运动猿app 网站开发,建站之星服务器题意#xff1a;给出一个由(,),?三种字符构成的序列#xff0c;让我们把其中的问号替换成左右括号#xff0c;使得整个序列变成一个完整地括号序列#xff0c;也就是括号匹配正确#xff0c;而且要求不能提前结束的括号序列#xf…题意给出一个由(,),?三种字符构成的序列让我们把其中的问号替换成左右括号使得整个序列变成一个完整地括号序列也就是括号匹配正确而且要求不能提前结束的括号序列比如(())()...这种的就是提前结束的括号序列一定要让整个序列的最后一个右括号字符正好匹配上字符串的第一个左括号字符。输出任意一种方案。 分析首先想到奇数长度的时候必定错误第一个括号是)或最后一个括号是都会出现错误。因为匹配必定错误
那么如果括号在中间的任何一个地方发现了与第一个左括号匹配也错误那么相当于尽可能的先写左括号能写左括号的地方写左括号直到左括号的数量足够多了等于n/2的时候再贪心的写右括号。如果能在解题的时候看透这一点程序就很好写了。
这样贪心正确的原因是错误的情况必定是左括号太少以至于匹配不了这么多右括号所以正确的case必定是前面留有足够的空间放置左括号去匹配后面的右括号。所以只要是问号且当前确定的左括号数量不到n/2就直接放左括号就行直到已经确定的左括号数量到n/2再不断放右括号。 #includeiostream
#includecstdio
#includecstring
#includecstdlib
using namespace std;
const int maxn 3e510;
char c[maxn];
void fail(){printf(:();exit(0);}
int main(){int n;scanf(%d%s,n,c);if((n%21)||c[0])||c[n-1]()fail();int bal0,ll0;for(int i0;in;i)if(c[i]()ll;for(int i0;in;i){if(c[i]()bal;if(c[i]))bal--;if(c[i]?){if(lln/2)c[i](,bal,ll;else c[i]),bal--;}if(i!n-1bal0)fail();}if(bal!0)fail();else printf(%s\n,c);return 0;
}