codeforces 1042c// Array Product// Codeforces Round #510(Div. 2)

题意:给出一个数组,2种操作:。1:x*y然后x消失,2:除掉x(2操作最多只能进行一次)。问最大的结果的一种操作方式。
逻辑题,看能不能想全面。

1先数好0,正,负的数量,zero,pos,neg。如果0数量不为0,在所有0的内部用操作1减少到只剩1个0,zero置1;(删去0不影响结果,如果结果是0,那么剩1个0也能做到,如果结果不是0,那么删0是必须的)

2负数有奇数个时(这种情况下一定有非负解)(1)如果zero=0,用操作2删掉最大的负数(不删结果负,删了必为正)(2)zero=1,用0和最大的负数乘。如果pos!=0或者neg!=1,再用操作2删去0;

3负数有0个时:如果有正数且zero=1,用操作2删去0;没正数结果只能为0(即给的数列全是0)

4负数

//#pragma comment(linker,"/STACK:1024000000,1024000000") 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#include <list>
using namespace std;
const int SZ=1000010,INF=0x7FFFFFFF;
typedef long long lon;
const double EPS=1e-9;
bool isneg(int x)
{
    return x<0;
}

bool ispos(int x)
{
    return x>0;
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin); 
    int n;
    cin>>n;
    vector<int> vct(n);
    for(int i=0;i<n;++i)
    {
        cin>>vct[i];
    }
    int negnum=count_if(vct.begin(),vct.end(),isneg);
    int zeronum=count(vct.begin(),vct.end(),0);
    int posnum=n-negnum-zeronum;
    //if(vct[0]==582204189 )cout<<negnum<<" "<<zeronum<<" "<<posnum<<endl;
    if(zeronum>1)
    {
        int last=-1;
        for(int i=0;i<n;++i)
        {
            if(vct[i]==0)
            {
                if(last!=-1)
                {
                    cout<<1<<" "<<last+1<<" "<<i+1<<endl;
                    vct[last]=-INF;
                }
                last=i;
                
            }
        }
    }
    if(negnum&1)
    {
        if(zeronum==0)
        {
            int maxv=-INF,maxid=0;
            for(int i=0;i<n;++i)
            {
                if(vct[i]<0&&vct[i]>maxv)
                {
                    maxv=vct[i];
                    maxid=i;
                }
            }
            cout<<2<<" "<<maxid+1<<endl;
            vct[maxid]=-INF;
        }
        else
        {
            int maxv=-INF,maxid=0;
            for(int i=0;i<n;++i)
            {
                if(vct[i]<0&&vct[i]>maxv)
                {
                    maxv=vct[i];
                    maxid=i;
                }
            }
            int pos=find(vct.begin(),vct.end(),0)-vct.begin();
            cout<<1<<" "<<maxid+1<<" "<<pos+1<<endl;
            if(posnum||negnum!=1)cout<<2<<" "<<pos+1<<endl;
            vct[maxid]=-INF;
            vct[pos]=-INF;
        }
    }
    else if(negnum==0)
    {
        if(posnum&&zeronum)
        {
            int pos=find(vct.begin(),vct.end(),0)-vct.begin();
            cout<<2<<" "<<pos+1<<endl;
            vct[pos]=-INF;
        }
            
    }
    else if(zeronum)
    {
        int pos=find(vct.begin(),vct.end(),0)-vct.begin();
        cout<<2<<" "<<pos+1<<endl;
        vct[pos]=-INF;
    }
    
    
        int last=-1;
        for(int i=0;i<n;++i)
        {
            if(vct[i]!=-INF)
            {
                if(last==-1)last=i;
                else
                {
                    cout<<1<<" "<<last+1<<" "<<i+1<<endl;
                    last=i;
                }
            }
        }
    return 0;
}

 

为其它偶数时(至少为2,一定有正数解),如果zero=1删去1

上面删的数用数组记录,最后没删的数用操作1乘起来。

转载于:https://www.cnblogs.com/gaudar/p/9669763.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值