2024.12.25 周三
2024.12.25 周三
Q1. 1100
A subarray is a continuous part of array.
Yarik recently found an array \(a\) of \(n\) elements and became very interested in finding the maximum sum of a non empty subarray. However, Yarik doesn't like consecutive integers with the same parity, so the subarray he chooses must have alternating parities for adjacent elements.
For example, \([1, 2, 3]\) is acceptable, but \([1, 2, 4]\) is not, as \(2\) and \(4\) are both even and adjacent.
You need to help Yarik by finding the maximum sum of such a subarray.
------------------------独自思考分割线------------------------
-
思路好想,实现的时候出了很多问题。
A1.
- 首先如果不考虑额外条件。一眼:遍历求前缀和同时维护最小前缀和(不能为空所以是\(i-1\)的),同时更新答案 \(pre[i]-min\_pre\) 。
- 额外条件是连续子数组不包含连续奇偶性相同的数。简单思考发现以满足额外条件将数组分为多个连续子数组,每个子数组单独计算。即分割后互不干扰/贡献独立。
------------------------代码分割线------------------------
A1.
#include <bits/stdc++.h>
#define int long long
using namespace std;
void _();
signed main()
{
int t=1;cin>>t;
while(t--) _();
}
void _()
{
int n;cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
vector<vector<int>> vec;
for(int i=1;i<=n;i++)
{
vector<int> t{a[i]};
int j=i+1;
for(;j<=n&&((abs(a[j])%2)!=(abs(a[j-1])%2));j++) // &1优先级、对负数 负数%2
t.push_back(a[j]);
vec.push_back(t);
i=j-1;
}
int res=-1e12;
for(auto a:vec)
{
// for(auto v:a) cout<<v<<' ';cout<<endl;
int ans=0;
res=max(res,a[0]);
if(a.size()>1)
{
ans=min(ans,a[0]);
int pre=a[0];
for(int i=1;i<a.size();i++)
{ ans=min(ans,pre);
pre+=a[i];
res=max(res,pre-ans);
}
}
}
cout<<res<<endl;
}

浙公网安备 33010602011771号