【BZOJ-3721】Final Bazarek 贪心
3721: PA2014 Final Bazarek
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 610 Solved: 243
[Submit][Status][Discuss]
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 2 1 3
3
2
3
4
Sample Output
9
-1
HINT
Source
Solution
贪心直接搞就可以
首先我们从大到小排序,然后处理出$sumV[i]$,$maxo[i]$,$maxe[i]$,$mino[i]$,$mine[i]$
分别表示:前缀和、后缀最大奇数、后缀最大偶数、前缀最小奇数、前缀最小偶数
然后对于一次询问K,如果$sumV[K]$为奇数,那么答案显然是$sumV[K]$
如果为偶数,考虑替换,把前缀最小奇数替换成后缀最大偶数,或前缀最小偶数替换成后缀最大奇数,这样取较大即可
这样替换,显然满足sum从偶变奇,且总和最大。
特判一下不合法的情况输出-1即可。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 1000100
int N,K,M;
int val[MAXN],mine[MAXN],maxo[MAXN],mino[MAXN],maxe[MAXN];
LL sumV[MAXN];
#define INF 0x7fffffff
bool cmp(int x,int y) {return x>y;}
void PreWork()
{
sort(val+,val+N+,cmp);
for (int i=; i<=N; i++) sumV[i]=sumV[i-]+(LL)val[i];
mine[]=INF; mino[]=INF;
for (int i=; i<=N; i++)
mine[i]=min(mine[i-],val[i]&? INF:val[i]),
mino[i]=min(mino[i-],val[i]&? val[i]:INF);
maxo[N+]=-INF; maxe[N+]=-INF;
for (int i=N; i>=; i--)
maxe[i]=max(maxe[i+],val[i]&? -INF:val[i]),
maxo[i]=max(maxo[i+],val[i]&? val[i]:-INF);
}
inline LL Ask(int K)
{
if (sumV[K]&) return sumV[K];
bool f1=,f2=; LL re=-INF;
if (mino[K]!=INF && maxe[K+]!=-INF) f1=;
if (mine[K]!=INF && maxo[K+]!=-INF) f2=;
if (!f1 && !f2) return (LL)-;
if (f1) re=max(re,sumV[K]-mino[K]+maxe[K+]);
if (f2) re=max(re,sumV[K]-mine[K]+maxo[K+]);
return re;
}
int main()
{
N=read();
for (int i=; i<=N; i++) val[i]=read();
M=read();
PreWork();
while (M--) K=read(),printf("%lld\n",Ask(K));
return ;
}
【BZOJ-3721】Final Bazarek 贪心的更多相关文章
- bzoj 3721 Final Bazarek
题目大意: n个数 选k个使和为奇数且最大 思路: 可以先将这n个数排序 然后先去最大的k个数 若和为奇数则直接输出 为偶数可以用没选的最大的奇数替换选了的最小的偶数或用没选的最大的偶数替换选了的最小 ...
- 【BZOJ3721】PA2014 Final Bazarek 贪心
[BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...
- bzoj 3721: PA2014 Final Bazarek 贪心
如果没有限制,直接取前 $k$ 大即可. 有限制,则只有几种可能:奇换偶,偶换奇. 维护奇数偶数的前缀最小值和后缀最大值即可. code: #include <bits/stdc++.h> ...
- BZOJ 3721: PA2014 Final Bazarek
3721: PA2014 Final Bazarek Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 645 Solved: 261[Submit][ ...
- BZOJ 3721: PA2014 Final Bazarek【乱搞】
有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n<=1000000),表示商品数量.接下来一行有n个整数,表示每件商品的价格,范 ...
- zoj 3721 Final Exam Arrangement【贪心】
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3721 来源:http://acm.hust.edu.cn/vjudg ...
- 【贪心】bzoj3721 PA2014 Final Bazarek
考虑不限制奇偶的情况,那就是直接排序取前k个的和. 加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者 将其中的最小的偶数替换成未被选择的数 ...
- BZOJ 1029 建筑抢修 贪心+堆
又搞了一晚上OI,编了两道BZOJ和几道NOI题库,临走之前写两篇感想 noip越来越近了,韩大和clove爷已经开始停课虐我们了... 1029: [JSOI2007]建筑抢修 Time Limit ...
- [bzoj 2151]种树(贪心)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 分析:原型是bzoj 1150(CTSC 2007) 首先DP无法下手,想到贪心.想到贪 ...
随机推荐
- mysql--测试前缀索引能否用于order by 或者 group by
创建一个测试用表 mysql> desc two; +-------+-------------+------+-----+---------+----------------+ | Field ...
- 用mysql触发器实现log记录
首先建立两张测试用表 mysql> desc pay; +-------+---------------+------+-----+---------+----------------+ | F ...
- 利用scp 远程上传下载文件/文件夹和ssh远程执行命令
利用scp传输文件 1.从服务器下载文件scp username@servername:/path/filename /tmp/local_destination例如scp codinglog@192 ...
- PAT 1004. 成绩排名 (20) JAVA
读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 多系统开发接口 - 苹果客户端开发接口
最近工作上需要,给苹果客户端开发接口,实现集中统一的用户管理,下面是接口调用参考. 1: 获取OpenId? http://127.0.0.1/GetOpenId.ashx?username=Admi ...
- Linux 网络编程详解七(并发僵尸进程处理)
在上一篇程序框架中,解决了子进程退出,父进程继续存在的功能,但是多条客户端连接如果同一时间并行退出,导致服务器端多个子进程同一时间全部退出,而SIGCHLD是不可靠信号,同时来多条信号可能无法处理,导 ...
- 后记:Cookie安全大辩论总结
前天,我发布在博客园上的某知名电商网站的Cookie漏洞引发园友们的热议,学到了很多知识,现在整理一下其中比较激烈的技术讨论.谁对谁错每个人自己心中都有一把称,很多时候都是我无法说服你,你也无法说服我 ...
- C#微信开发小白成长教程二(新手接入指南,附视频)
距离第一讲又已经过去了一个多星期了,本打算一周更新一讲的,奈何实在太忙.最近也在群里发现有一部分人已经可以熟练调用微信的部分接口但却不是很清楚微信公众平台接收消息的一个处理机制.本讲就来介绍下怎么接入 ...
- 移动OA,致我们终将逝去的青春(程序员版)[转]
移动OA和致青春有什么关系,难道说赵薇也来做手机应用了?为什么不行,当年小燕子代言的打印机可是红火的很,现在再秀一把时尚手机办公也未必不可啊.言归正转,本文还是以点代面阐述移动OA开发过程,但是,它的 ...
- Android开发环境部署
引言 在windows系统中安装Android的开发环境,将分为五个步骤来完成: 第一步:安装JDK 第二步:配置Windows上JDK的变量环境 第三步: 下载安装Eclipse 第四步:下载安 ...