CF1469B Red and Blue

原题链接
题目描述
Monocarp had a sequence aa consisting of n + mn+m integers a_1, a_2, \dots, a_{n + m}a
1

,a
2

,…,a
n+m

. He painted the elements into two colors, red and blue; nn elements were painted red, all other mm elements were painted blue.

After painting the elements, he has written two sequences r_1, r_2, \dots, r_nr
1

,r
2

,…,r
n

and b_1, b_2, \dots, b_mb
1

,b
2

,…,b
m

. The sequence rr consisted of all red elements of aa in the order they appeared in aa ; similarly, the sequence bb consisted of all blue elements of aa in the order they appeared in aa as well.

Unfortunately, the original sequence was lost, and Monocarp only has the sequences rr and bb . He wants to restore the original sequence. In case there are multiple ways to restore it, he wants to choose a way to restore that maximizes the value of

f ( a ) = max ⁡ ( 0 , a 1 , ( a 1 + a 2 ) , ( a 1 + a 2 + a 3 ) , … , ( a 1 + a 2 + a 3 + ⋯ + a n + m ) ) < / p > < p > H e l p M o n o c a r p t o c a l c u l a t e t h e m a x i m u m p o s s i b l e v a l u e o f f ( a ) f ( a ) f(a) = \max(0, a_1, (a_1 + a_2), (a_1 + a_2 + a_3), \dots, (a_1 + a_2 + a_3 + \dots + a_{n + m})) </p><p>Help Monocarp to calculate the maximum possible value of f(a)f(a) f(a)=max(0,a1,(a1+a2),(a1+a2+a3),,(a1+a2+a3++an+m))</p><p>HelpMonocarptocalculatethemaximumpossiblevalueoff(a)f(a).

输入格式
The first line contains one integer tt ( 1 \le t \le 10001≤t≤1000 ) — the number of test cases. Then the test cases follow. Each test case consists of four lines.

The first line of each test case contains one integer nn ( 1 \le n \le 1001≤n≤100 ).

The second line contains nn integers r_1, r_2, \dots, r_nr
1

,r
2

,…,r
n

( -100 \le r_i \le 100−100≤r
i

≤100 ).

The third line contains one integer mm ( 1 \le m \le 1001≤m≤100 ).

The fourth line contains mm integers b_1, b_2, \dots, b_mb
1

,b
2

,…,b
m

( -100 \le b_i \le 100−100≤b
i

≤100 ).

输出格式
For each test case, print one integer — the maximum possible value of f(a)f(a) .

题意翻译
多测。

给定两个序列 rr 和 bb,现在可以将它们合并成一个序列,要求是原来同组内的元素相对顺序不变。

设合并后是长度为 nn 的序列 aa。

定义该序列的权值为:

\max_{0\le i\le n}(\sum_{j=1}^ia_j)
0≤i≤n
max

(
j=1

i

a
j

)

你现在需要找到并输出这个最大值。

输入输出样例
输入 #1复制
4
4
6 -5 7 -3
3
2 3 -4
2
1 1
4
10 -3 2 2
5
-1 -2 -3 -4 -5
5
-1 -2 -3 -4 -5
1
0
1
0
输出 #1复制
13
13
0
0
说明/提示
In the explanations for the sample test cases, red elements are marked as bold.

In the first test case, one of the possible sequences aa is [\mathbf{6}, 2, \mathbf{-5}, 3, \mathbf{7}, \mathbf{-3}, -4][6,2,−5,3,7,−3,−4] .

In the second test case, one of the possible sequences aa is [10, \mathbf{1}, -3, \mathbf{1}, 2, 2][10,1,−3,1,2,2] .

In the third test case, one of the possible sequences aa is [\mathbf{-1}, -1, -2, -3, \mathbf{-2}, -4, -5, \mathbf{-3}, \mathbf{-4}, \mathbf{-5}][−1,−1,−2,−3,−2,−4,−5,−3,−4,−5] .

In the fourth test case, one of the possible sequences aa is [0, \mathbf{0}][0,0] .

思路
分别求两个数组最大的前缀和再相加即可,因为合并后的序列也是要求和找最大值,且是从左到右依次相加,不能跳,所以找两个数组的最大值,然后把两个最大值的区间放在一起即可。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int a,b;
		cin>>a;
		int maxnn=0,maxn=0;
		int num[10005]={0},num1[10005]={0},sum[10005]={0},sum1[10005]={0};
		for(int i=1;i<=a;i++) 
		{
			cin>>num[i];
			sum[i]=sum[i-1]+num[i];
			maxn=max(sum[i],maxn);
		}
		cin>>b;
		for(int i=1;i<=b;i++)
		{
			cin>>num1[i];
			sum1[i]=sum1[i-1]+num1[i];
			maxnn=max(maxnn,sum1[i]);
		}
		cout<<maxn+maxnn<<endl;
		
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值