_October has a question:
You are given n integers a1,a2,…,an. Find the maximum value of max(al,al+1,…,ar)⋅min(al,al+1,…,ar)over all pairs (l,r) of integers for which 1≤l<r≤n.
INPUT:
The first line contains a single integer n(2≤n≤10
3
) .
The second line contains n integers a1,a2,…,an(1≤ai≤10
6
).
OUTPUT:
Please print a single integer — the maximum possible value of the product from the statement.
SAMPLE INPUT1:
3
2 4 3
SAMPLE OUTPUT1:
12
Note:
Let f(l,r)=max(al,al+1,…,ar)⋅min(al,al+1,…,ar).
In the first test case,
f(1,2)=max(a1,a2)⋅min(a1,a2)=max(2,4)⋅min(2,4)=4⋅2=8.
f(1,3)=max(a1,a2,a3)⋅min(a1,a2,a3)=max(2,4,3)⋅min(2,4,3)=4⋅2=8.
f(2,3)=max(a2,a3)⋅min(a2,a3)=max(4,3)⋅min(4,3)=4⋅3=12.
So the maximum is f(2,3)=12.
SAMPLE INPUT2:
4
3 2 3 1
SAMPLE OUTPUT2:
6
Advanced challenge :What if the maxinum of n is 3∗10
5
?
印象中这是Codeforces中出现过这样一道题,可参考下述思路:
先说下大致题意:
给定长度为n的序列,考虑所有的l,r满足1≤l<r≤n:在区间a[l]~a[r]中,计算h=max(a[l] ~ a[r]) * min(a[l] ~ a[r])。在所有的l和r组合中,找到h的最大值。
贪心算法思想
实现想法:每次只找前后两个数相乘,遍历数列去找到最大的的乘积即可。
代码实现:
#include <stdio.h>
#include<stdlib.h>
int main()
{
int t, n, max, min, x;
int i, j, k, l;
scanf("%d", &t);
long long a,flag = 1;
long long b[100000];//数组开大一点儿,以免溢出
for (i = 0; i<t; i++)
{
flag = 1;
scanf("%d", &n);
for (j = 0; j<n; j++)
{
scanf("%lld", &b[j]);
}
for (j = 0; j < n - 1; j++)
{
a = b[j] * b[j + 1];
if (a >= flag)
{
flag = a;
}
}
printf("%lld\n", flag);
}
return 0;
希望对题主有所帮助,望采纳!
#include <stdio.h>
#include <limits.h>
#define N 10
int max(int *a, int l, int r)
{
int m = INT_MIN;
for (int i = l; i <= r; i++)
if (a[i] > m)
m = a[i];
return m;
}
int min(int *a, int l, int r)
{
int m = INT_MAX;
for (int i = l; i <= r; i++)
if (a[i] < m)
m = a[i];
return m;
}
int main()
{
int a[N];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
int m = INT_MIN;
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
int x = max(a, i, j) * min(a, i, j);
if (x > m)
m = x;
}
}
printf("%d", m);
return 0;
}