【ICPC】2022西安站 J. Strange Sum | 贪心、签到

162 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

【ICPC】2022西安站 J. Strange Sum | 贪心、签到

题目链接

Problem - J - Codeforces

题目

Given a sequence a1,a2,,ana_1,a_2,…,a_n.

You are going to select zero or more elements of aa so that: if you select aia_i, then in any interval of length i (formally, in a[j,j+i1]a[j,j+i−1] for any 1jni+11≤j≤n−i+1) you can select at most 2 elements.

Calculate the maximal sum of the elements you select.

Input

The first line contains an integer nn (2n1052≤n≤10^5).

The second line contains nn integers a1,a2,,ana_1,a_2,…,a_n (109ai109−10^9≤a_i≤10^9).

Output

Output a single integer denoting the answer.

题目大意

对于给定的长度为 nn 的数组 a1,a2,,ana_1,a_2,…,a_n, 从中选择若干个元素满足下述条件:

  • 若选择了 aia_i,则在 aa 数组中任意长度为 ii 的连续子数组中最多只能选择两个元素。即对于任意的 jj 满足 1jni+11≤j≤n−i+1,原数组中任意长度为 ii 的子段 aj,aj+1,...,aj+i1a_j,a_{j+1},...,a_{j+i-1} 中只能选择 2 个元素。

最大化选择的元素之和。

思路

赛中想了半天还试图反驳队友的正确思路QAQ,直到一看榜单过了 100+ 队伍才幡然悔悟……

如果我们选择的所有元素中,下标最大的那一个的下标是 ii,则 a1,a2,...,ai1,aia_1,a _2,...,a_{i-1},a_i 中最多只能选择两个元素。

也就是说,也就是说我们最多只能选择两个元素。院题的题意可以直接等同于在整个数组中选择不超过两个元素,最大化他们的和。

又因为原数组中可能存在元素的值小于 0,所以我们先对给定的数组排序后,最终的答案就是 max(0,an,an1+an)\max(0,a_n,a_{n-1}+a_n)

代码

#include <bits/stdc++.h>

using namespace std;

int a[100005];
int main(){
	int n;
	scanf("%d", &n);
	for( int i = 1; i <= n; i++) scanf("%d", &a[i]);
	sort(a +1, a + n + 1);
	printf("%d", max({0, a[n], a[n] + a[n-1]}));
        return 0;
}