思路:很容易发现当数组全是0时,是"NO";题中的数据保证a[1]+a[2]+....+a[n]=0,因此在枚举的时候,就能保证a[l]+a[l+1]+..a[r]<max-min;先将0放在最前面,不影响结果。如果现在数组中的和为负数,优先放入正数;如果现在数组中的和为正数时,优先放入负数。
const int N = 5e5 + 10, M = 5e2 + 10;
int n,m;
int a[N],b[N],c[N],d[N];
void df()
{
cin>>n;
int o1=0,o2=0,o3=0;
int flag=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==0)flag++;
else b[++o1]=a[i];
}
if(flag==n)cout<<"No"<<endl;
else
{
sort(b+1,b+1+o1);
while(flag--)d[++o3]=0;//前面放下0
int num=0;
int i=1,j=o1;
while(i<=j)
{
if(num<=0)
{
num+=b[j];
d[++o3]=b[j--];
}
else
{
num+=b[i];
d[++o3]=b[i++];
}
}
cout<<"Yes"<<endl;
for(int i=1;i<=n;i++)cout<<d[i]<<" ";
cout<<endl;
}
}