题解:SP4560 ANARC05B - The Double HeLiX

题意:

在两条严格递增的整数序列中找到一条路径,使得路径上经过的数字之和最大。路径的规则是:

  1. 可以从任意序列的开头开始行走。
  2. 当遇到两个序列中共有的数字(即交叉点)时,可以选择继续在当前序列行走,或者切换到另一条序列。

思路:

\(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';
	}
}
posted @ 2024-10-02 17:41  cly312  阅读(17)  评论(0)    收藏  举报