(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
- (HDU 5831)2016 Multi-University Training Contest 8 Rikka with Parenthesis II(水?)
- hdu 5831 Rikka with Parenthesis II(2016 Multi-University Training Contest 8——模拟)
- HDU 5831 Rikka with Parenthesis II 2016 Multi-University Training Contest 8
- hdu 5831 Rikka with Parenthesis II 2016 Multi-University 8
- 2016 Multi-University Training Contest 8 1011 Rikka with Parenthesis II(模拟)
- hdu5831 Rikka with Parenthesis II 2016 Multi-University Training Contest 8 解题报告
- hdu 5828 2016 Multi-University Training Contest 8 Rikka with Sequence 解题报告
- HDU 6093 Rikka with Number (2017 Multi-University Training Contest
- 2017 Multi-University Training Contest 5 &&HDU 6085 Rikka with Candies 【bitset+思维】
- HDU 6086 Rikka with String(2017 Multi-University Training Contest 3)
- hdu 5831 Rikka with Parenthesis II【水题】
- HDU 5831 Rikka with Parenthesis II
- hdu 5831 (Rikka with Parenthesis II)
- HDU 5831 Rikka with Parenthesis II
- HDU 5831 Rikka with Parenthesis II
- HDU 5831 Rikka with Parenthesis II
- HDU 5831Rikka with Parenthesis II
- hdu 5831 Rikka with Parenthesis II
- HDU-5813-Elegant Construction-贪心
- android中ToolBar设置setNavigationOnClickListener()方法不起作用
- zoj 1610 Count the Colors(线段树)
- HDU 2602 Bone Collector 收集骨头+最基本的01背包
- 监控系统大全
- (HDU 5831)2016 Multi-University Training Contest 8 Rikka with Parenthesis II(水?)
- 安装python numpy
- iOS面试题(一)
- JDBC中BLOB的用法
- RecyclerView(控件)
- Retrofit1文件上传
- hibernate中二级缓存配置详细解析
- 常用算法之:选择排序(C语言版)
- Python 字符串前面加'r'