想了想是可以貪心過的,先遍歷一遍,記錄大於等於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;
}