c语言简单运用,需要强的英语理解力

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