题意:给出N个数,要求把它们分到三个集合中,使三个集合所有元素的积分别满足:小于零;大于零;等于零。题目保证有解。
思路:题目保证有解,说明每个集合元素都至少有一个,而且我们可以得知,至少有一个负数和一个零。所以这样构造:
1.只放一个负数到第一个集合。
2.正数放到第二个集合中,保证第二个集合有元素。
3.如果负数还剩奇数个,就把一个放到第三个集合中,剩下的偶数个负数放到第二个集合中;
如果负数还剩偶数个,都把他们放到第二个集合中即可。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define lb(x) (x&-(x))
const int N = 101010;
int n;
int a[1100];
int main()
{
while(scanf("%d",&n)==1)
{ int minus=0,zero=0,pos=0;
rep(i,0,n)
{
scanf("%d",&a[i]);
if(a[i]<0)minus++;
else if(a[i]==0)zero++;
}
pos=n-minus-zero;
sort(a,a+n);
printf("1 ");
printf("%d\n",a[0]);
if(minus%2)
{
printf("%d",minus-1+pos);
for(int i=1;i<=n;i++)
{
if(a[i]!=0)
printf(" %d",a[i]);
}
printf("\n");
printf("%d",zero);
rep(i,0,zero) printf(" 0");printf("\n");
}
else
{
printf("%d",minus-2+pos);
for(int i=2;i<=n;i++)
{
if(a[i]!=0)
printf(" %d",a[i]);
}
printf("\n");
printf("%d",zero+1);
printf(" %d",a[1]);
rep(i,0,zero) printf(" 0");printf("\n");
}
}
return 0;
}