AtCoder Beginner Contest 167 比赛人数11940 比赛开始后15分钟看到A题,之后每隔一分钟,看到一道题,在比赛开始后第21分钟看到所有题
AtCoder Beginner Contest 167 F Bracket Sequencing 匹配之后的3种形态继续匹配
总目录详见https://blog.csdn.net/mrcrack/article/details/104454762
在线测评地址https://atcoder.jp/contests/abc167/tasks/abc167_f
思路:让读入的字串,先进行()匹配,之后会剩下((((,))))),)))))(((((,3种形态,再进行匹配。
AC代码如下
#include <cstdio>
#include <algorithm>
#define maxn 1000010
using namespace std;
char s[maxn];
struct node{
int l,r;
}a[maxn];
int tot;
int cmp(node a,node b){
return a.l-a.r>b.l-b.r;//((((((让左括号剩得尽可能多
}
int main(){
int n,i,j,l,r,ln,rn;
ln=rn=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
l=r=0;
scanf("%s",s+1);
for(j=1;s[j];j++){
if(s[j]=='(')l++;
else if(s[j]==')'){
if(l)l--;//匹配
else r++;
}
}
if(l&&!r)ln+=l;//剩下((((((
else if(!l&&r)rn+=r;//剩下))))))
else if(l&&r) a[++tot]=(node){l,r};//剩下))))))((((((
}
sort(a+1,a+1+tot,cmp);
for(i=1;i<=tot;i++)
if(ln<a[i].r)return printf("No\n"),0;
else ln-=a[i].r,ln+=a[i].l;//匹配
if(ln!=rn)return printf("No\n"),0;
printf("Yes\n");
return 0;
}