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
 
要求答案是奇数的01背包,并且体积为1
首先考虑去掉奇数的限制,那么很显然从大到小排序完贪心就好了
如果加上了奇数的限制,那么需要在上面的基础上做调整
如果答案就是奇数,那么不作任何处理。
如果答案是偶数,我们可以通过把集合中一个奇数换成偶数,或者一个偶数换成奇数来使得答案变成奇数。
于是只要用前缀和、保存前k个中的最小奇数/偶数、保存后k个中的最大奇数/偶数,每次可以O(1)出解。
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<queue>
  8. #include<deque>
  9. #include<set>
  10. #include<map>
  11. #include<ctime>
  12. #define LL long long
  13. #define inf 1000000000000000ll
  14. #define pa pair<int,int>
  15. #define pi 3.1415926535897932384626433832795028841971
  16. #define N 1000010
  17. using namespace std;
  18. int n,m;
  19. LL a[N];
  20. LL sum[N];
  21. LL mno[N],mne[N],mxo[N],mxe[N];
  22. inline LL read()
  23. {
  24. LL x=0,f=1;char ch=getchar();
  25. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  26. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  27. return x*f;
  28. }
  29. int main()
  30. {
  31. n=read();
  32. for (int i=1;i<=n;i++)a[i]=read();
  33. sort(a+1,a+n+1,greater<LL>());
  34. for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
  35. mxo[n+1]=mxe[n+1]=-inf;
  36. mno[0]=mne[0]=inf;
  37. for(int i=1;i<=n;i++)
  38. {
  39. mne[i]=mne[i-1];mno[i]=mno[i-1];
  40. if (a[i]&1)mne[i]=min(mne[i],a[i]);
  41. else mno[i]=min(mno[i],a[i]);
  42. }
  43. for (int i=n;i>=1;i--)
  44. {
  45. mxe[i]=mxe[i+1];mxo[i]=mxo[i+1];
  46. if (a[i]&1)mxe[i]=max(mxe[i],a[i]);
  47. else mxo[i]=max(mxo[i],a[i]);
  48. }
  49. m=read();
  50. for (int i=1;i<=m;i++)
  51. {
  52. int q=read();
  53. if (sum[q]&1)
  54. {
  55. printf("%lld\n",sum[q]);
  56. continue;
  57. }
  58. LL ans=-1;
  59. if(mno[q]!=inf&&mxe[q+1]!=-inf) ans=max(ans,sum[q]-mno[q]+mxe[q+1]);
  60. if(mne[q]!=inf&&mxo[q+1]!=-inf) ans=max(ans,sum[q]-mne[q]+mxo[q+1]);
  61. printf("%lld\n",ans);
  62. }
  63. return 0;
  64. }

  

bzoj3721 [PA2014 Final] Bazarek的更多相关文章

  1. 【贪心】bzoj3721 PA2014 Final Bazarek

    考虑不限制奇偶的情况,那就是直接排序取前k个的和. 加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者 将其中的最小的偶数替换成未被选择的数 ...

  2. 【BZOJ3721】PA2014 Final Bazarek 贪心

    [BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...

  3. BZOJ 3721: PA2014 Final Bazarek

    3721: PA2014 Final Bazarek Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 645  Solved: 261[Submit][ ...

  4. 【BZOJ-3721】Final Bazarek 贪心

    3721: PA2014 Final Bazarek Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 610  Solved: 243[Submit][ ...

  5. BZOJ 3721: PA2014 Final Bazarek【乱搞】

    有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n<=1000000),表示商品数量.接下来一行有n个整数,表示每件商品的价格,范 ...

  6. bzoj 3721: PA2014 Final Bazarek 贪心

    如果没有限制,直接取前 $k$ 大即可. 有限制,则只有几种可能:奇换偶,偶换奇. 维护奇数偶数的前缀最小值和后缀最大值即可. code: #include <bits/stdc++.h> ...

  7. 【BZOJ3727】PA2014 Final Zadanie 树形DP

    [BZOJ3727]PA2014 Final Zadanie Description 吉丽YY了一道神题,题面是这样的:“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行 ...

  8. 【BZOJ 3727】 3727: PA2014 Final Zadanie (递推)

    3727: PA2014 Final Zadanie Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 279  Solved: 121 Descript ...

  9. bzoj 3722: PA2014 Final Budowa

    3722: PA2014 Final Budowa Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 303  Solved: 108[Submit][St ...

随机推荐

  1. 减少leftJoin的使用 (转)

    作为开发,你是否经常碰到下面需要转换用户ID成用户名称的情况: 可惜你的这些业务表出于最少冗余设计要求,只有UserId,而没有UserName,这时你不得不破坏你一个类封装一个表的美好想法, 在你的 ...

  2. redis 学习笔记一

    找了半天,发觉还是redis的源码看起来比较舒服.所以决定今年把redis的源码读一遍顺便做个读书笔记.好好记录下.话说现在越来不越不愿意用脑袋来记录东西,喜欢靠note来记.话说这样不爱用脑会不会过 ...

  3. linux考试基础知识测验

    Linux系统管理基础测试(100分钟) 姓名: 座位号: 一.单项选择题:(每小题0.5分,共计30分)  1.    cron 后台常驻程序 (daemon) 用于:D A. 负责文件在网络中的共 ...

  4. HTML浅识

    HTML相关======= ## 认识网页 *web标准(w3c三种标准):结构标准 -->html 表现标准 -->css 行为标准 -->js **浏览器和服务器:浏览器发送报文 ...

  5. Java小项目--坦克大战(version1.0)

    Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...

  6. [Javascript] Advanced Reduce: Composing Functions with Reduce

    Learn how to use array reduction to create functional pipelines by composing arrays of functions. co ...

  7. 你所不知道的java编程思想

    读thinking in java这本书的时候,有这么一句话“在编译单元的内部,可以有一个公共(public)类,它必须拥有与文件相同的名字” 有以下疑问: 在一个类中说可以有一个public类,那是 ...

  8. (转)IIS7 下部署Asp.net应用

    最近在部署一个ASP.NET的应用到IIS7中的时候,遇到了一些问题,现在把部署中的遇到的问题和部署步骤进行总结一下,本文中只涉及到ASP.NET的基本部署. 一.    部署环境 Windows 7 ...

  9. SQL 增加或删除一列

    SQL 增加或删除一列 alter table tablename drop column columnname;alter table tabelname add columnname varcha ...

  10. DTO学习系列之AutoMapper(四)

    本篇目录: Mapping Inheritance-映射继承 Queryable Extensions (LINQ)-扩展查询表达式 Configuration-配置 Conditional Mapp ...