【bzoj3721】 PA2014 Final Bazarek

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

Sample Output

7
9

-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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值