A. Avoiding Zero
题意:
给你一个数组,要求你找到一个排列,使得它的每个前缀和都不等于0.
思路:
可以贪心。
- 假如pre【n】=0;(那么不管怎么调整,都会有最后一个肯定为0)
- 先排序
- pre【n】>0.那么说明正数更多,把正数移到前部。
- pre【n】<0.那么说明负数更多,直接把有序的输出即可。
AC
#include <iostream>
#include <algorithm>
#include <vector>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
using namespace std;
int a[100];
void ans(int a){
if(a)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int tt;cin>>tt;
while(tt--){
int n;cin>>n;
int sum=0;
For(i,1,n)cin>>a[i],sum+=a[i];
sort(a+1,a+1+n);
if(sum==0)ans(0);
else if(sum>0){
ans(1);
reverse(a+1,a+1+n);
For(i,1,n)cout<<a[i]<<' ';
cout<<endl;
}else {
ans(1);
For(i,1,n)cout<<a[i]<<' ';
cout<<endl;
}
}
return 0;
}