[HDU6299] Balanced Sequence【贪心】

6299 Balanced Sequence

这道毒瘤贪心题,反正我打了2个多小时没有调出来,机房里的dalao直接大力猜结论,直接A了此题,Orz。

然而这题我没有写掉。考完后才发现,我的贪心完全反了。

先讲一下贪心的做法,对每个字符串的左右括号个数进行分类讨论。
1. 如果左括号多,那么就将这个放到序列后半段,然后让右括号数量少的放后面,这样能使右括号没匹配上的少。
2. 如果右括号多,那么就将这个放到序列前半段,然后让左括号数量少的放前面,同样的意思。
但是我写的时候不是让没匹配上的越少越好,而是让匹配上的越多越好。

但是这就会反例了,我是这么理解的,不知是否有误:不一定你想匹配的全匹配上,如果有一个左括号特别多,但是还是少于右括号的,这种可能会被放在最后,但是放在较中间的位置更好一些。换种说法,尽量让右半段自己匹配最多与左半段自己匹配最多,然后剩下左右两端匹配起来。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,n,que[100005],Len1,Len2,Len3;
char s[100005];
struct xcw{int Q,H,Z;}a[100005],a1[100005],a2[100005];
bool cmp1(xcw x,xcw y){return x.H>y.H||(x.H==y.H&&x.Q<y.Q);}
bool cmp2(xcw x,xcw y){return x.Q<y.Q||(x.Q==y.Q&&x.H>y.H);}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("T2.in","r",stdin);
    freopen("T2.out","w",stdout);
    #endif 
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);Len1=Len2=0;
        for(int i=1;i<=n;i++){
            s[0]=0;gets(s);
            while(!s[0]) gets(s);
            int Len=strlen(s);
            a[i]=(xcw){0,0,0};
            int Now=0;
            for(int j=0;j<Len;j++){
                if(Now>-a[i].Q&&s[j]==')') a[i].Z++;
                Now+=((s[j]=='(')?1:-1);
                a[i].Q=max(a[i].Q,-Now);
            }
            Now=0;
            for(int j=Len-1;j>=0;j--){
                Now+=((s[j]=='(')?1:-1);
                a[i].H=max(a[i].H,Now);
            }
        }
        for(int i=1;i<=n;i++){
            if(a[i].Q-a[i].H<=0) a2[++Len2]=a[i];
            else a1[++Len1]=a[i];
        } 
        sort(a1+1,a1+1+Len1,cmp1);sort(a2+1,a2+1+Len2,cmp2);
        for(int i=1;i<=Len2;i++) a[i]=a2[i];
        for(int i=1;i<=Len1;i++) a[i+Len2]=a1[i];
        int Ans=a[1].Z*2,Now=a[1].H;
        for(int i=2;i<=n;i++){
            Ans+=a[i].Z*2;
            if(a[i].Q>Now) Ans+=Now*2,Now=0;
            else Ans+=a[i].Q*2,Now-=a[i].Q;
            Now+=a[i].H;
        }
        printf("%d\n",Ans);
    }
    return 0;
}
posted @ 2018-07-24 13:14  XSamsara  阅读(96)  评论(0编辑  收藏  举报