Karina的数组的最大美丽度

题目

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;
} 

运行结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值