求调!!!
查看原帖
求调!!!
554145
Night_sea_64楼主2023/8/9 23:47

我重排的过程跟题解不一样。我搞了两个 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;
}
2023/8/9 23:47
加载中...