我重排的过程跟题解不一样。我搞了两个 queue,一个存正数一个存负数。维护 sum 表示当前重排完了的元素之和。如果 sum<0 就放一个正数,否则就放一个负数。
这份代码 WA 了。有可能也不是重排的问题,但是到底是哪里错了呢?
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int q,n,a[1010];
bool f[1001][10001];
queue<int>q1,q2;
const int k=5000;
int main()
{
cin>>q;
while(q--)
{
cin>>n;
int avg=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
avg+=a[i];
}
if(avg/n*n!=avg)
{
cout<<"No"<<endl;
continue;
}
avg/=n;
bool flag=0;
for(int i=1;i<=n;i++)
{
a[i]-=avg;
if(a[i]<0)q1.push(a[i]);
else if(a[i]>0)q2.push(a[i]);
else
{
flag=1;
break;
}
}
if(flag)
{
cout<<"Yes"<<endl;
continue;
}
int sum=0;
for(int i=1;i<=n;i++)
if(sum<0)
{
a[i]=q2.front(),sum+=q2.front();
q2.pop();
}
else
{
a[i]=q1.front(),sum+=q1.front();
q1.pop();
}
int cnt=0;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
f[i][a[i]+k]=1;
for(int j=-5000;j<=5000;j++)
{
f[i][j+k]|=f[i-1][j-a[i]+k];
if(j==0&&f[i][j+k])cnt++;
}
}
cout<<((cnt>1)?"Yes":"No")<<endl;
}
return 0;
}