[测试题]数组(array)
Description

Input

Output

Sample Input1
3 2 7
5 4 2
Sample Output1
999999732
Sample Explanation1

Sample Input2
5 3 1
5 4 3 5 5
Sample Output2
0
Sample Explanation2

Hint


题解
由于负数是肯定小于正数的,我们首先想到的就是将乘积变成负数。我们可以统计输入的负数个数。
那么会有两种情况:
$(i)$无论怎么变变不了负数,这个时候我们将所有数取绝对值。
我们需要使乘积最小,这时只需要将绝对值最小的数减小即可。
证明:
假设有四个正整数$a_1,a_2,a_3,a_4$,满足$a_1<a_2<a_3<a_4$。需要减去$x$。
我们取极端情况若$a_1-x$:
原式$=(a_1-x)*a_2*a_3*a_4$
$=a_1*a_2*a_3*a_4-x*a_2*a_3*a_4$
若$a_4-x$:
原式$=a_1*a_2*a_3*(a_4-x)$
$=a_1*a_2*a_3*a_4-x*a_1*a_2*a_3$
由于$-x*a_2*a_3*a_4<-x*a_1*a_2*a_3$
显然得证。
$(ii)$可以变成负数,我们变完负数后同样将所有数取绝对值。
既然已经是负数了,那我们只需所有的数的绝对值积最大即可。
证明同上,只是改变了加减。
所以我们只需要用小根堆维护绝对值最小的数即可。
我是用两个堆分别维护正数和负数。同时注意不要边减边取模,因为保存的是绝对值,和负数直接取模不同。
详见代码。
#include<map>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define LL long long
#define RE register
#define IL inline
using namespace std;
const LL N=2e5;
const LL MOD=1e9+; priority_queue<LL, vector<LL>, greater<LL> >a,b;
LL n,k,x,ai;
LL cnt;
bool flag;
IL void print()
{
LL sum=;
while (!a.empty())
{
LL tmp=-a.top()%MOD;a.pop();
sum=(sum*tmp)%MOD;
}
while (!b.empty())
{
LL tmp=b.top()%MOD;b.pop();
sum=(sum*tmp)%MOD;
}
printf("%lld\n",(sum+MOD)%MOD);
exit();
}
IL void cuta()
{
if (a.top()/x+(bool)(a.top()%x)>=k)
{
LL tmp=a.top();a.pop();
tmp=(tmp-(LL)k*(LL)x/*%MOD*/)/*%MOD*/;
a.push(tmp);
print();
}
else
{
LL tmp=a.top();a.pop();
tmp=(tmp-(LL)(a.top()/x+(bool)(a.top()%x))*(LL)x)/*%MOD*/;
k-=a.top()/x+(bool)(a.top()%x);
b.push(-tmp);
}
}
IL void cutb()
{
if (b.top()/x+(bool)(b.top()%x)>=k)
{
LL tmp=b.top();b.pop();
tmp=(tmp-(LL)k*(LL)x/*%MOD*/)/*%MOD*/;
b.push(tmp);
print();
}
else
{
LL tmp=b.top();b.pop();
tmp=(tmp-(LL)(b.top()/x+(bool)(b.top()%x))*(LL)x)/*%MOD*/;
k-=b.top()/x+(bool)(b.top()%x);
a.push(-tmp);
}
}
IL LL getnum()
{
if (a.empty()) {flag=;LL tmp=b.top();b.pop();return tmp;}
if (b.empty()) {flag=;LL tmp=a.top();a.pop();return tmp;}
if (a.top()>b.top()) {flag=;LL tmp=b.top();b.pop();return tmp;}
{flag=;LL tmp=a.top();a.pop();return tmp;}
} int main()
{
scanf("%lld%lld%lld",&n,&k,&x);
for (RE LL i=;i<=n;i++)
{
scanf("%lld",&ai);
if (ai<) cnt++,a.push(-ai);
else b.push(ai);
}
if (cnt%==)
{
if (cnt==) cutb();
else if (cnt==n) cuta();
else
{
if (a.top()>=b.top()) cutb();
else cuta();
}
}
if (!k) print();
while (k--)
{
LL tmp=getnum();
tmp=(tmp+x)/*%MOD*/;
if (flag) a.push(tmp);
else b.push(tmp);
}
print();
return ;
}
[测试题]数组(array)的更多相关文章
- Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别
ArrayList和Vector的区别ArrayList与Vector主要从二方面来说. 一.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...
- go 数组(array)、切片(slice)、map、结构体(struct)
一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...
- javascript类型系统——数组array
× 目录 [1]创建 [2]本质 [3]稀疏[4]长度[5]遍历[6]类数组 前面的话 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javascript中的数组与 ...
- swift基本用法-数组array
数组简单用法 //------------------------------------------------------------------------------ // 1. 数组定义 / ...
- C#中数组Array、ArrayList、泛型List<T>的比较
在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...
- Javascript基础系列之(四)数据类型 (数组 array)
字符串,数值,布尔值都属于离散值(scalar),如果某个变量是离散的,那么任何时候它只有一个值. 如果想使用变量存储一组值,就需要使用数组(array). 数组是由多个名称相同的树值构成的集合,集合 ...
- AS3 - 数组Array的几个常用方法(附样例)
AS3 - 数组Array的几个常用方法(附样例) 2015-03-30 10:39发布:hangge浏览:241 Flex/Flash开发中,经常会使用到数组,下面总结了一些数组的常用方法. 1 ...
- Linux数组array基础
Linux数组array基础[${a[*]}和$a的区别] Bash中,数组变量的赋值有两种方法: (1) name = (value1 ... valuen) 此时下标从0开始 (2) name[i ...
- 学习Swift -- 数组(Array) - 持续更新
集合类型--数组 Array是Swift中的一种集合类型:数组,数组是使用有序列表储存同一类型的多个值,与OC的NSArray的最大不同是,Swift的数组是值类型,OC的数组是引用类型 声明数组的方 ...
随机推荐
- JavaEE HttpServlet 解析
上一篇 文章中有提到,GenericServlet 是对 Servlet 的一个通用实现,并提供了一个抽象的 service() 方法.而我们的互联网是使用 Http 协议来通信的,那针对这个&quo ...
- Leetcode 4——Partition List
Problems: Given a linked list and a value x, partition it such that all nodes less than x come befor ...
- 20155215 第二周测试1 与 myod
课堂测试 第一题 每个.c一个文件,每个 .h一个文件,文件名中最好有自己的学号 用Vi输入图中代码,并用gcc编译通过 在Vi中使用K查找printf的帮助文档 提交vi编辑过程截图,要全屏,包含自 ...
- 冲刺NO.10
Alpha冲刺第十天 站立式会议 项目进展 项目核心功能逐步构建完成,测试工作也已开始.主要对部分功能组合进行测试以测试系统可用性. 问题困难 项目的主要困难在这个时间点主要存在于测试工作中,测试工作 ...
- Exception in thread "main" expected '<document start>', but found BlockMappingStart in 'reader', line 23, column 2: nimbus.host: "master"
平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6 hadoop 1.2.1 启动storm的时候,遇到这个问题,百度之后,看到大家的解决方案 ...
- 201421123042 《Java程序设计》第3周学习总结
#Week03-面向对象入门 1. 本周学习总结 1.1写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 本周学习关键词:类,对象,封装,关键词:final,this,statis. 1 ...
- nyoj 苹果
苹果 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. ...
- 09-移动端开发教程-Sass入门
1. 引言 CSS3之前的CSS都大都是枚举属性样式,而编程语言强大的变量.函数.循环.分支等功能基本都不能在CSS中使用,让CSS的编程黯淡无光,Sass就是一种增强CSS编程的扩展语言(CSS4也 ...
- mongodb 定时备份
通过centos 脚步来执行备份操作,使用crontab实现定时功能,并删除指定天数前的备份 具体操作: 1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod ...
- 延迟确认和Nagle算法
前篇文章介绍了三次握手和四次挥手,了解了TCP是如何建立和断开连接的,文末还提到了抓包挥手时的一个“异常”现象,当时无法解释,特地查了资料,知道了数据传输中的延迟确认策略. 何谓延迟确认策略? WIK ...