CodeForces - 300A

本文介绍了一种算法,用于将一组整数分配到三个不同集合中,使得各集合的乘积满足小于零、大于零及等于零的条件。通过合理安排正数、负数和零的位置,确保了每个集合至少包含一个元素。

题意:给出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;  
     }   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值