Description
有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价。
Input
第一行一个整数n(1<=n<=1000000),表示商品数量。
接下来一行有n个整数,表示每件商品的价格,范围在[1,10^9]。
接下来一行有一个整数m(1<=m<=1000000),表示询问数量。
接下来m行,每行一个整数k[i](1<=k[i]<=n)。
Output
对于每个询问,输出一行表示保证奇数的情况下最大的总价。若无法满足要求,输出-1。
Sample Input
4
4 2 1 3
3
2
3
4
4 2 1 3
3
2
3
4
Sample Output
79
-1
Solve
从大到小排序,先取前k个,如果不是奇数考虑调整
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define int long long
using namespace std;
const int N=1000005;
int a[N],be[N][2],af[N][2],n,m,k;
long long sum[N],ans;
bool cmp(int i,int j){return i>j;}
main (){
scanf ("%lld",&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];
for (int i=1;i<=n;++i){
be[i][0]=be[i-1][0];
be[i][1]=be[i-1][1];
be[i][(a[i]&1)]=a[i];
}
for (int i=n;i;--i){
af[i][0]=af[i+1][0];
af[i][1]=af[i+1][1];
af[i][(a[i]&1)]=a[i];
}
scanf ("%lld",&m);
for (int i=1;i<=m;++i){
scanf ("%lld",&k);
if (sum[k]&1)printf ("%lld\n",sum[k]);
else {
ans=-1;
if (be[k][1] && af[k+1][0])ans=sum[k]-be[k][1]+af[k+1][0];
if (be[k][0] && af[k+1][1])
ans=max(ans,sum[k]-be[k][0]+af[k+1][1]);
printf ("%lld\n",ans);
}
}
return 0;
}