题解:SP4560 ANARC05B - The Double HeLiX
题意:
在两条严格递增的整数序列中找到一条路径,使得路径上经过的数字之和最大。路径的规则是:
- 可以从任意序列的开头开始行走。
- 当遇到两个序列中共有的数字(即交叉点)时,可以选择继续在当前序列行走,或者切换到另一条序列。
思路:
\(sum1\) 和 \(sum2\) 用于分别累加在序列 \(a\) 和 \(b\) 上行走时的数字之和。
遍历过程:
- 如果序列 \(a\) 已经遍历完毕,但序列 \(b\) 还未结束,则将序列 \(b\) 剩余的元素全部加到 \(sum2\)。
- 如果 \(a_i < b_j\),说明当前 \(a_i\) 在序列 \(b\) 中没有对应,故将其加到 \(sum1\) 中,并移动 \(i\)。
- 当 \(a_i = b_j\) 时,选择之前两个序列中累计和较大的那个路径,将其累计和加到 \(res\) 中。然后将 \(sum1\) 和 \(sum2\) 都重置为当前的交叉点值 \(a_i\) (因为无论选择哪条路径,交叉点的值都要累加)。
- 当循环结束后,可能还有未处理的累计和,需要将 \(sum1\) 和 \(sum2\) 中较大的一个加到 \(res\) 中。
代码:
#include<bits/stdc++.h>
#define wrhlovezcx true
using namespace std;
int a[10010],b[10010],m,n;
int main(){
while(wrhlovezcx){
cin>>m;
if(m==0) return 0;
for(int i=0;i<m;i++)
cin>>a[i];
cin>>n;
for(int i=0;i<n;i++)
cin>>b[i];
int sum1=0,sum2=0,i=0,j=0,res=0;
while(i<m||j<n){
if(i==m)
while(j<n)
sum2+=b[j++];
else if(j==n)
while(i<m)
sum1+=a[i++];
else if(a[i]<b[j])
sum1+=a[i++];
else if(a[i]>b[j])
sum2+=b[j++];
else{
res+=max(sum1,sum2);
sum1=sum2=a[i];
i++;
j++;
}
}
res+=max(sum1,sum2);
cout<<res<<'\n';
}
}

浙公网安备 33010602011771号