跳到主要内容
原文178 词数1 分钟

题解:P9367 [ICPC 2022 Xi'an R] Strange Sum

概述

给定长度 n 的序列,选若干元素(可不选)使和最大,约束是若选了下标 i 的元素,则每个长度为 i 的子区间最多选 2 个元素。设被选元素中下标最大的是 a_x,则区间 1 到 x 内最多选 2 个,于是整个序列至多选两个元素。答案在不选、选最大值、选最大两值之和三者中取最大。时间复杂度 O(n)。

题意简述​

给定长度为 nn 的序列 aia_i,选择若干元素(可以不选),求元素之和的最大值。需要满足若选择 aia_i,则所有长度为 ii 的子区间中最多只能选择 22 个元素。

解题思路​

假设选择编号最大的元素为 axa_x,那么在区间 [1,x][1,x] 中最多只能选择两个元素,因为序列中没有比 axa_x 编号更大的元素。

因此,整个序列中最多只能选择两个元素,考虑三种情况的最大值即可:

  1. 不选择任何元素:00;
  2. 选择 11 个元素:max⁡1\max_1;
  3. 选择 22 个元素:max⁡1+max⁡2\max_1+\max_2。

参考代码​

324 Bcpp
#include <bits/stdc++.h>
using namespace std;

const int inf=0x3f3f3f3f;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int mx1=-inf,mx2=-inf;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
if(t>mx1){mx2=mx1;mx1=t;}
else if(t>mx2){mx2=t;}
}
cout<<max({0,mx1,mx1+mx2})<<'\n';
return 0;
}