[测试题]数组(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的数组是引用类型 声明数组的方 ...
随机推荐
- 【RabbitMQ系列】 Spring mvc整合RabbitMQ
一.linux下安装rabbitmq 1.安装erlang环境 wget http://erlang.org/download/otp_src_18.2.1.tar.gz tar xvfz otp_s ...
- Linux下ftp和ssh详解
学习了几天Linux下ftp和ssh的搭建和使用,故记录一下.学习ftp和ssh的主要目的是为了连接远程主机,并且进行文件传输.废话不多说,直接开讲! ftp服务器 1. 环境搭建 本人的系统是Arc ...
- scrapy 数据存储mysql
#spider.pyfrom scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Ru ...
- android context获取目录详解
获取 sqlite系统数据库路径 方式1: ApkInfo apkInfo = new ResourceUtil(context).getApkInfo(); APP_PATH = new Strin ...
- Scala 操作符与提取器
实际上Scala没有操作符, 只是以操作符的格式使用方法. 操作符的优先级取决于第一个字符(除了赋值操作符), 而结合性取决于最后一个字符 Scala的操作符命名更加灵活:) 操作符 中置操作符(In ...
- php函数var_dump() 、print_r()、echo()
var_dump() 能打印出类型 print_r() 只能打出值 echo() 是正常输出... 需要精确调试的时候用 var_dump(); 一般查看的时候用 print_r() 另外 , ech ...
- LeetCode & Q414-Third Maximum Number-Easy
Array Math Description: Given a non-empty array of integers, return the third maximum number in this ...
- 你能选择出,前几个元素吗?使用纯css
面试被问到 ,你能选择出前几个元素吗?括弧只能使用css 我当时是一脸懵逼... 回去的路上思考一路 终于想到了解决办法 虽然为时已晚 但是觉得很有意义... 首先要用到 否定选择器 : :not() ...
- python 类的绑定方法和非绑定方法
一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. class People: def __ ...
- 文本分类学习(三) 特征权重(TF/IDF)和特征提取
上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...