序列分解 51Nod - 1400

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1400

想不到有多项式复杂度的办法 两个序列要完全一样 要求还是很严格的 并且n很小 考虑搜索

主要就是个数量剪枝 看剩下的数还能不能均分

#include <bits/stdc++.h>
using namespace std;
const int maxn=100;

int ary[maxn],a[maxn],b[maxn],cnt[maxn],cnta[maxn],cntb[maxn];
int n;

bool dfs(int cur,int na,int nb)
{
    if(cur==n+1) return true;
    if(na<n/2&&cnt[ary[cur]]-1+cntb[ary[cur]]>=cnta[ary[cur]]+1)
    {
        a[na+1]=ary[cur];
        cnt[ary[cur]]--,cnta[ary[cur]]++;
        if(dfs(cur+1,na+1,nb)) return true;
        cnt[ary[cur]]++,cnta[ary[cur]]--;
    }
    if(nb<na&&cnt[ary[cur]]-1+cnta[ary[cur]]>=cntb[ary[cur]]+1&&ary[cur]==a[nb+1])
    {
        b[nb+1]=ary[cur];
        cnt[ary[cur]]--,cntb[ary[cur]]++;
        if(dfs(cur+1,na,nb+1)) return true;
        cnt[ary[cur]]++,cntb[ary[cur]]--;
    }

    return false;
}

int main()
{
    int tmp[100];
    int t,len,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&ary[i]);
            tmp[i]=ary[i];
        }
        if(n%2==0)
        {
            sort(tmp+1,tmp+n+1);
            len=unique(tmp+1,tmp+n+1)-tmp-1;
            for(i=1;i<=n;i++) ary[i]=lower_bound(tmp+1,tmp+len+1,ary[i])-tmp;
            memset(cnt,0,sizeof(cnt));
            for(i=1;i<=n;i++) cnt[ary[i]]++;
            for(i=1;i<=len;i++) if(cnt[i]%2) break;
            if(i==len+1)
            {
                memset(cnta,0,sizeof(cnta));
                memset(cntb,0,sizeof(cntb));
                if(dfs(1,0,0)) printf("Good job!!\n");
                else printf("What a pity!\n");
            }
            else printf("What a pity!\n");
        }
        else printf("What a pity!\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/82918190