(HDU 5831)2016 Multi-University Training Contest 8 Rikka with Parenthesis II(水?)

来源:互联网 发布:找网络水军公司 编辑:程序博客网 时间:2024/06/06 05:47

思路

引用题解:

最优情况下一定交换第一个右括号和最后一个左括号,交换后判断一下即可。 时间复杂度 O(n)

这题是水题只是因为只能交换一次。。

判断一个表达式是否合法,只需要从左往右扫描,在扫描的过程中,左括号的个数要始终大于等于右括号的个数。

比赛时的做法是,找出第一个从左往右不合规范的右括号,从右往左找出第一个不合规范的左括号,交换后进行合法性判断。

我不知道这两种做法是不是都是严谨的,反正水过去了。。

参考代码

#include <bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))#define rep(i,a,b) for(int i=a;i<b;i++)#define debug(a) printf("a =: %d\n",a);const int INF=0x3f3f3f3f;const int maxn=1e5+50;const int Mod=1000000007;const double PI=acos(-1);typedef long long ll;using namespace std;int n;char s[maxn];bool ok(){    int l=0,r=0;    for(int i=0;i<n;i++){        if (s[i]=='(') l++;        else r++;        if (r>l) return false;    }    return l==r;}bool check(){    int len=n;    if (len&1) return false;    int L=-1,R=-1;    for(int i=0;i<len;i++){        if (s[i]==')') {            L=i; break;        }    }    for(int i=len-1;i>=0;i--){        if (s[i]=='('){            R=i; break;        }    }    if (L==-1 || R==-1) return false;    swap(s[L],s[R]);    return ok();}int main(){    #ifndef ONLINE_JUDGE        freopen("in.txt","r",stdin);    #endif    int T; scanf("%d",&T);    for(int cs=1;cs<=T;cs++){        scanf("%d %s",&n,s);        if (check()) puts("Yes");        else puts("No");    }    return 0;}

代码

#include <bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))#define rep(i,a,b) for(int i=a;i<b;i++)#define debug(a) printf("a =: %d\n",a);const int INF=0x3f3f3f3f;const int maxn=1e5+50;const int Mod=1000000007;const double PI=acos(-1);typedef long long ll;using namespace std;int n;char s[maxn];bool ok(){    int l=0,r=0;    for(int i=0;i<n;i++){        if (s[i]=='(') l++;        else r++;        if (r>l) return false;    }    return l==r;}bool check(){    int len=n;    if (len&1) return false;    if (strcmp(s,"()")==0) return false;    int L=-1,R=-1;    int i=0;    int l,r;    l=r=0;    for(;i<len;i++){        if (s[i]=='(') l++;        else r++;        if (r>l) {            L=i;            i++;            break;        }    }    if (L==-1) return l==r && ok();    l=r=0;    int j;    for(j=len-1;j>=i;j--){        if (s[j]=='(') l++;        else r++;        if (l>r) {            R=j;            break;        }    }    if (R==-1) return false; //   cout<<L<<" "<<R<<endl;    swap(s[L],s[R]);    return ok();}int main(){    #ifndef ONLINE_JUDGE        freopen("in.txt","r",stdin);    #endif    int T; scanf("%d",&T);    for(int cs=1;cs<=T;cs++){        scanf("%d %s",&n,s);        if (check()) puts("Yes");        else puts("No");    }    return 0;}
0 0