不错的题,先排序,从大到小取k个,如果为奇数就直接输出,否则去掉前面一个最小的偶数加上后面一个最大的奇数,或者去掉前面一个最小的奇数加上后面一个最大的偶数。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 1000010
using namespace std;
long long a[maxn],sum[maxn];
long long pre0[maxn],pre1[maxn],suf0[maxn],suf1[maxn];
int n,T;
bool cmp(long long x,long long y)
{
return x>y;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
pre0[0]=pre1[0]=-1;
for (int i=1;i<=n;i++)
if (a[i]&1) pre0[i]=pre0[i-1],pre1[i]=a[i];
else pre1[i]=pre1[i-1],pre0[i]=a[i];
suf0[n+1]=suf1[n+1]=-1;
for (int i=n;i>=1;i--)
if (a[i]&1) suf0[i]=suf0[i+1],suf1[i]=a[i];
else suf1[i]=suf1[i+1],suf0[i]=a[i];
scanf("%d",&T);
while (T--)
{
int k;
scanf("%d",&k);
if (sum[k]&1) printf("%lld\n",sum[k]);
else
{
long long ans=-1;
if (pre0[k]!=-1 && suf1[k+1]!=-1) ans=max(ans,sum[k]-pre0[k]+suf1[k+1]);
if (pre1[k]!=-1 && suf0[k+1]!=-1) ans=max(ans,sum[k]-pre1[k]+suf0[k+1]);
printf("%lld\n",ans);
}
}
return 0;
}