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;
}