Codeforces Round #735 (Div. 2) A. Cherry

题目大意

给出一个长度为 n n n的数组 a 1 , a 2 , ⋯   , a n a_1,a_2,\cdots,a_n a1,a2,,an
求最大的 max ⁡ { a l , a l + 1 , ⋯   , a r } × min ⁡ { a l , a l + 1 , ⋯   , a r } \max\{a_l,a_{l+1},\cdots,a_r\}\times\min\{a_l,a_{l+1},\cdots,a_r\} max{al,al+1,,ar}×min{al,al+1,,ar}

时间限制

1s

数据范围

2 ≤ n ≤ 1 0 5 2\le n \le10^5 2n105

题解

不能发现最大值只会出现在相邻两个之中。
不妨假设 a , b a,b a,b相邻,且 a > b a>b a>b,此时的答案就是 a × b a\times b a×b
现在假设加入一个 c c c

  1. c > a c>a c>a c c c a a a相邻,如果计算 a , b , c a,b,c a,b,c三个数,则答案为 c × b > a × b c\times b > a \times b c×b>a×b。看上去好像有点问题,但不难发现,因为 a a a c c c相邻,故更优的答案 a × c a\times c a×c已经统计了,因此 c × b > c × b > a × b c\times b>c\times b > a \times b c×b>c×b>a×b
  2. c > a c>a c>a c c c b b b相邻,则 a , b , c a,b,c a,b,c的答案就是 b × c b\times c b×c,因为 b , c b,c b,c相邻,所以此答案也被统计过了。
  3. a > c > b a>c>b a>c>b c c c a a a相邻,则 a , b , c a,b,c a,b,c的答案还是 a × b a\times b a×b,答案此时仍存在更优的答案 a × c a\times c a×c
  4. a > b > c a>b>c a>b>c c c c b b b相邻,则 a , b , c a,b,c a,b,c的答案还是 a × b a\times b a×b,这个答案已经在 a , b a,b a,b相邻的时候统计过了。
  5. c < b < a c<b<a c<b<a,无论 c c c在哪里,都将使 a , b , c a,b,c a,b,c答案变小,均没有 a × b a\times b a×b优。

综上,可以直到,判断相邻的就可以得出答案。

Code

//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <map>
#define ll long long
#define G getchar
using namespace std;

int read()
{
    char ch;
    for(ch = G();ch < '0' || ch > '9';ch = G());
    int n = 0;
    for(;'0' <= ch && ch <= '9';ch = G())n = (n<<1)+(n<<3)+ch-48;
    return n;
}

void write(int x)
{
    if (x > 9)
    {
        write(x / 10);
        putchar(x % 10 + 48);
    }
    else putchar(x + 48);
}

const int N = 100005;
const int mo = 998244353;

int n , a[N];
ll ans;

int main()
{
    //freopen("i.in","r",stdin);
    //freopen("e.out","w",stdout);
    
    for (int T = read() ; T ; T--)
    {
        n = read();
        for (int i = 0 ; i < n ; i++)
            a[i] = read();
        ans = 0;
        for (int i = 1 ; i < n ; i++)
            ans = max(ans , (ll) a[i] * a[i - 1]);
        printf("%lld\n", ans);
    }

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值