AtCoder Beginner Contest 167 F.Bracket Sequencing

AtCoder Beginner Contest 167 F.Bracket Sequencing

题目链接
AtCoder Beginner Contest 167 F.Bracket Sequencing_第1张图片
判断括号匹配的字符串问题~
首先给出的所有字符串的左右括号数是要匹配的,这个很好判断,用一个变量存一下即可~
接下来判断这些字符串能否构成合理的括号序列,用 p a i r pair pair 存储每个字符串需要的匹配数和需要的右括号数,我们试想,合法的括号序列一定是左括号尽量靠左,右括号靠右的,所以我们要对其就行排序,最后用一个变量记录当前的待匹配数 r e s res res,如果 p a i r pair pair 的右括号数超过待匹配数,则输出 N o No No,AC代码如下:

#include
using namespace std;
int n,res=0,sum=0;
string s;
vector<pair<int,int> >v;
bool cmp(pair<int,int>p1,pair<int,int>p2) {return min(p1.second,p1.first+p2.second)>min(p2.second,p2.first+p1.second);}
main()
{
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s;
        int cnt=0,mn=0;
        for(char c:s) c=='('?cnt++:cnt--,mn=min(mn,cnt);
        v.emplace_back(cnt,mn);
        sum+=cnt;
    }
    if(sum!=0) {puts("No");exit(0);}
    sort(v.begin(),v.end(),cmp);
    for(pair<int,int>p:v){
        if(res<-p.second){
            puts("No");exit(0);
        }
        res+=p.first;
    }
    puts("Yes");
    return 0;
}

你可能感兴趣的:(AtCoder,vector,pair)