小米 校园招聘 笔试题-最大连续子序列乘积
- 题目描述:
- 给定一个浮点数序列(可能有正数、0和负数),求出一个最大的连续子序列乘积。
- 输入:
- 输入可能包含多个测试样例。
每个测试样例的第一行仅包含正整数 n(n<=100000),表示浮点数序列的个数。
第二行输入n个浮点数用空格分隔。
输入数据保证所有数字乘积在双精度浮点数表示的范围内。
- 输出:
- 对应每个测试案例,输出序列中最大的连续子序列乘积,若乘积为浮点数请保留2位小数,如果最大乘积为负数,输出-1。
- 不管正负一律计算两次。一个保存最大值,一个保存最小值。负数越小,绝对值就越大。(暴力解决的时间复杂度n^2,肯定会超时!)
05
double
d1, d2;
//分别保存最大值和最小值
06
int
n;
07
double
ans, d, tmp1, tmp2;
08
int
main() {
09
while
(~
scanf
(
"%d"
, &n)) {
10
scanf
(
"%lf"
, &d1);
11
ans = d2 = d1;
12
for
(
int
i = 1; i < n; i++) {
13
scanf
(
"%lf"
, &d);
14
tmp1 = d1 * d;
15
tmp2 = d2 * d;
16
d1 = max(max(tmp1, tmp2), d);
17
d2 = min(min(tmp1, tmp2), d);
18
if
(d1 > ans)
19
ans = d1;
20
}
21
22
int
t = (
int
) ans;
23
if
(ans < 0) {
24
puts
(
"-1"
);
25
}
else
{
26
if
(ans == t)
27
printf
(
"%d\n"
, t);
28
else
29
printf
(
"%.2f\n"
, ans);
30
}
31
}
32
}