P12159 [蓝桥杯 2025 省 Java B] 数组翻转

题目描述

小明生成了一个长度为 nnn 的正整数数组 a1,a2,…,ana_1, a_2, \dots , a_na1,a2,,an,他可以选择连续的一段数 al,al+1,…,ara_l, a_{l+1}, \dots, a_ral,al+1,,ar,如果其中所有数都相等即 al=al+1=⋯=ara_l = a_{l+1} = \dots = a_ral=al+1==ar,那么他可以获得 (r−l+1)×al(r - l + 1) \times a_l(rl+1)×al 的分数。

在选择之前,为了让分数尽可能大,他决定先选择数组中的一段区间,对其进行左右翻转。他想知道在对数组进行翻转之后他能获得的最大分数是多少?

提示:当翻转 ala_lalara_rar 这段区间后,整个数组会变为:

a1,a2,…,al−1,ar,ar−1,…,al+1,al,ar+1,…,ana_1, a_2, \dots , a_{l-1}, a_r, a_{r-1}, \dots , a_{l+1}, a_l, a_{r+1}, \dots , a_na1,a2,,al1,ar,ar1,,al+1,al,ar+1,,an

输入格式

输入共两行。

  • 第一行为一个正整数 nnn
  • 第二行为 nnn 个由空格分开的正整数 a1,a2,…,ana_1, a_2, \dots , a_na1,a2,,an

输出格式

输出共 111 行,一个整数表示答案。

输入输出样例 #1

输入 #1

7
4 4 3 3 2 1 3

输出 #1

9

说明/提示

样例说明

翻转区间 [5,7][5, 7][5,7],数组变为 4,4,3,3,3,1,24, 4, 3, 3, 3, 1, 24,4,3,3,3,1,2,最大分数为选择三个 333

评测用例规模与约定

  • 对于 20%20\%20% 的评测用例,n≤500n \leq 500n500
  • 对于 100%100\%100% 的评测用例,1≤n≤1061\leq n \leq 10^61n1061≤ai≤1061\leq a_i \leq 10^61ai106

C++实现

#include <bits/stdc++.h>
#define maxn 1000010
#define x first
#define y second
#define int long long
using namespace std;

int n, ans;
int a[maxn], pre[maxn];
unordered_map<int, pair<int, int> >mp;
signed main(){
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    for (int i = 2, res = 1; i <= n + 1; i++) {
        if (a[i] == a[i - 1]) res++;
        else {
            if (mp[a[i - 1]].x < res) 
				mp[a[i - 1]].y = mp[a[i - 1]].x, mp[a[i - 1]].x = res;
            else if (mp[a[i - 1]].y < res) 
				mp[a[i - 1]].y = res;
            res = 1;
        }
    }
    for (auto i : mp) ans = max(ans, i.x * (i.y.x + i.y.y));
    printf("%lld", ans);
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐