Serval and Parenthesis Sequence CodeForces - 1153C 贪心
生活随笔
收集整理的這篇文章主要介紹了
Serval and Parenthesis Sequence CodeForces - 1153C 贪心
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給出一個由"(",")","?"三種字符構成的序列,讓我們把其中的問號替換成左右括號,使得整個序列變成一個完整地括號序列,也就是括號匹配正確,而且要求不能提前結束的括號序列,比如(())()...這種的就是提前結束的括號序列,一定要讓整個序列的最后一個右括號字符正好匹配上字符串的第一個左括號字符。輸出任意一種方案。
?
分析:首先想到奇數長度的時候必定錯誤,第一個括號是),或最后一個括號是(都會出現錯誤。因為匹配必定錯誤
那么如果括號在中間的任何一個地方發現了與第一個左括號匹配也錯誤,那么相當于盡可能的先寫左括號,能寫左括號的地方寫左括號,直到左括號的數量足夠多了,等于n/2的時候再貪心的寫右括號。如果能在解題的時候看透這一點,程序就很好寫了。
這樣貪心正確的原因是:錯誤的情況必定是左括號太少以至于匹配不了這么多右括號,所以正確的case必定是前面留有足夠的空間放置左括號去匹配后面的右括號。所以只要是問號,且當前確定的左括號數量不到n/2,就直接放左括號就行,直到已經確定的左括號數量到n/2再不斷放右括號。
?
?
?
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; const int maxn = 3e5+10; char c[maxn]; void fail(){printf(":(");exit(0);} int main(){int n;scanf("%d%s",&n,c);if((n%2==1)||c[0]==')'||c[n-1]=='(')fail();int bal=0,ll=0;for(int i=0;i<n;i++)if(c[i]=='(')ll++;for(int i=0;i<n;i++){if(c[i]=='(')bal++;if(c[i]==')')bal--;if(c[i]=='?'){if(ll<n/2)c[i]='(',bal++,ll++;else c[i]=')',bal--;}if(i!=n-1&&bal==0)fail();}if(bal!=0)fail();else printf("%s\n",c);return 0; }?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Serval and Parenthesis Sequence CodeForces - 1153C 贪心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPLT2017题目
- 下一篇: linux系统 硬链接和软链接