题目
Karina有一个长度为n的整数数组a1,a2,a3,…,an。她喜欢乘法运算,所以她决定一对数字的美丽度就是它们的乘积。而数组的美丽度就是数组中相邻元素的乘积的最大值。
例如,对于n=4,a=[3,5,7,4],数组的美丽度是max(3⋅5, 5⋅7, 7⋅4) = max(15, 35, 28) = 35。
Karina希望她的数组尽可能美丽。为了达到这个目标,她可以从数组中删除一些元素(可能为零)。在Karina删除她想要的所有元素之后,数组必须至少包含两个元素。
不幸的是,Karina没有足够的时间完成所有任务,所以她请你计算通过删除任意数量的元素(可能为零)可以获得的数组的最大美丽度。
输入
输入的第一行包含一个整数t(1≤t≤10^4)- 测试用例的数量。
接下来是t个测试用例的描述。
每个测试用例的第一行包含一个整数n(2≤n≤2⋅10^5)- 数组a的长度。
每个测试用例的第二行包含n个整数a1,a2,a3,…,an(−10^9≤ai≤10^9)- 数组a的元素。
所有测试用例中n的值的总和不超过2⋅10^5。
输出
输出t个整数,每个整数是对应测试用例的答案 - Karina可以获得的数组的最大美丽度。
示例
输入
7 4 5 0 2 1 3 -1 1 0 5 2 0 -1 -4 0 6 -8 4 3 7 1 -9 6 0 3 -2 5 -4 -4 2 1000000000 910000000 7 -1 -7 -2 -5 -4 -6 -3
输出
10
0
4
72
16
910000000000000000
42
注意
在示例的第一个测试用例中,为了获得最大的美丽度,你需要删除第二个元素。
在示例的第二个和第三个测试用例中,不需要删除任何元素就可以达到最大的美丽度。
在示例的第四个测试用例中,你需要只保留第一个和最后一个元素。
C程序代码源码-1
#include <stdio.h>
#include <limits.h>
long long max_beauty(int n, int a[]) {
long long max1 = LLONG_MIN, max2 = LLONG_MIN;
long long min1 = LLONG_MAX, min2 = LLONG_MAX;
for (int i = 0; i < n; i++) {
if (a[i] > max1) {
max2 = max1;
max1 = a[i];
} else if (a[i] > max2) {
max2 = a[i];
}
if (a[i] < min1) {
min2 = min1;
min1 = a[i];
} else if (a[i] < min2) {
min2 = a[i];
}
}
long long max_beauty = (max1 * max2 > min1 * min2) ? max1 * max2 : min1 * min2;
return max_beauty;
}
int main() {
int t;
scanf("%d", &t);
long long results[t];
for (int i = 0; i < t; i++) {
int n;
scanf("%d", &n);
int a[n];
for (int j = 0; j < n; j++) {
scanf("%d", &a[j]);
}
results[i] = max_beauty(n, a);
}
for (int i = 0; i < t; i++) {
printf("%lld\n", results[i]);
}
return 0;
}
C程序代码源码-2
#include<stdio.h>
int main(){
int group,count;
long long z1,z2,b[10];
scanf("%d",&group);
for(int i=0;i<group;i++){
scanf("%d",&count);
long long a[count];
for(int i=0;i<count;i++ ){
scanf("%lld",&a[i]);
}
for(int i=0;i<count-1;i++){
for(int j=0;j<count-1-i;j++){
if(a[j]>a[j+1]){
long long t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
z1=a[0]*a[1];
z2=a[count-1]*a[count-2];
if(z1>z2){
b[i]=z1;
}else{
b[i]=z2;
}
}
for(int i=0;i<count;i++){
printf("%lld\n",b[i]);
}
return 0;
}