想了想是可以贪心过的,先遍历一遍,记录大于等于0的数的偶数个数和奇数个数,然后进行从大到小排序,如果所有值都小于零,那么遍历一下输出第一个奇数;如果奇数个数是奇数,直接把大于零的数全部加起来即可;如果奇数个数是零,那么先把所有正数加起来,在加上负数里的第一个奇数;剩下的情况就是正数的奇数个数为偶数(非零),这种情况可以先把所有正数加起来,然后比较负数里的第一个奇数和正数里的最后一个奇数的绝对值大小即可。
#include<bits/stdc++.h>
using namespace std;
int n,a[100005],ji=0,ou=0,res=0;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=0&&a[i]&1)ji++;
else if(a[i]>=0&&a[i]%2==0)ou++;
}
sort(a,a+n,greater <int>() );
if(ji+ou==0)
{
for(int i=0;i<n;i++)
{
if(a[i]%2)
{
cout<<a[i];
return 0;
}
}
}
if(ji&1)
{
for(int i=0;i<n;i++)
{
if(a[i]>=0)res+=a[i];
else break;
}
cout<<res;
}
else if(ji==0)
{
int i=0;
for(i=0;i<n;i++)
{
if(a[i]>=0)res+=a[i];
else break;
}
for(;i<n;i++)
{
if(a[i]&1)
{
res+=a[i];
break;
}
}
cout<<res;
}
else
{
int num=0,ma,fma=-1e9;
for(int i=0;i<n;i++)
{
if(a[i]>=0)res+=a[i];
else break;
}
for(int i=0;i<n;i++)
{
if(a[i]>=0&&num<ji-1)num++;
else if(a[i]>=0&&(a[i]&1)&&num==ji-1)ma=a[i];
else if(a[i]<0&&(a[i]&1))
{
fma=a[i];
break;
}
}
cout<<max(res-ma,res+fma);
}
return 0;
}