2018HDU 多校赛1002 Balanced Sequence

题目链接

解题心得:当没有思路时,枚举所有贪心的策略

l指 指向左边的括号,即右括号 r指 指向右边的括号,即左括号
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
char S[500000];
struct node
{
    int l,r;
}data[500000];
int cmp(node a,node b)
{
    int x= min(a.l,b.r);
    int y = min(a.r,b.l);
    return x>y|(x==y&&a.l>b.l);
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        scanf("%d",&n);
        long long ans = 0;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",S);
            int len = strlen(S);
            int tmp_l = 0,tmp_r = 0;
            for(int j=0;j<len;j++)
            {
                if(S[j]=='(')
                    tmp_l++;
                else
                {
                    if(tmp_l>0)
                    {
                        tmp_l--;
                        ans++;
                    }
                    else tmp_r++;
                }
            }
            //cout<<tmp_l<<" "<<tmp_r<<endl;
            data[i].l = tmp_l;
            data[i].r = tmp_r;
        }

        sort(data+1,data+1+n,cmp);
//        for(int i=1;i<=n;i++)
//            cout<<data[i].l<<" "<<data[i].r<<endl;
        int tmp_ll = 0;
        for(int i=1;i<n;i++)
        {

            ans+=min(data[i].l,data[i+1].r);


            int o =  data[i+1].r-min(data[i].l,data[i+1].r);
            ans+=min(o,tmp_ll);
            tmp_ll-=min(o,tmp_ll);
            tmp_ll = tmp_ll+ data[i].l-min(data[i].l,data[i+1].r);;

        }
        cout<<ans*2<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/axuhongbo/article/details/81175204
今日推荐