3493. 最大的和

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3493. 最大的和相关的知识,希望对你有一定的参考价值。

给定一个长度为 n 的正整数数列 a1,a2,…,an。

初始时,数列中的每个元素要么处于可选状态,要么处于不可选状态。

你可以选择一个长度恰好为 k 的区间 [i,i+k−1],使得 ai∼ai+k−1 这 k 个元素的状态全部变为可选。

请问,在经过此操作后,所有处于可选状态的元素之和最大是多少。

输入格式
第一行包含两个整数 n 和 k。

第二行包含 n 个整数 ai。

第三行包含一个长度为 n 的 01 序列,如果第 i 个数为 1,表示 ai 的初始状态为可选,如果第 i 个数为 0,表示 ai 的初始状态为不可选。

输出格式
一行一个整数,表示答案。

数据范围
对于 30% 的数据,1≤k≤n≤1000
对于 100% 的数据,1≤k≤n≤105,1≤ai≤105

输入样例1:

3 1
2 5 4
0 0 1

输出样例1:

9

输入样例2:

4 3
10 5 4 7
0 1 1 0

输出样例2:

19

总结:
1、可以将问题分解为:一开始是1的数S1和后来由0变1的数S2。这样一来,在S1确定的情况下,S2即一段里曾是0的数越多越大越好
2、双指针:每次求一段里的和,向后移一格,只改变两个数据,减去最前的和加上新的最后的。

ps:段错误竟是因为N开小了。

详见代码:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
const int N=10010;
int main()
{
	int n,k,a[N],b[N];
	cin>>n>>k;
	
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++)
	{
		cin>>b[i];
	}
	
	long long int sum=0,done=0;
	long long int maxx=0;
	
	//可 
	for(int i=0;i<n;i++)
	{
		if(b[i]) done=done+a[i];
	}
	
	//不可
	for(int i=0;i<n-k;i++)
	{
		sum=0;
		for(int j=0;j<k;j++)
		{
			if(!b[i+j]) sum=sum+a[i+j];
		}
		maxx=max(maxx,sum);
	 } 
	cout<<maxx+done;
	return 0;
}

以上是关于3493. 最大的和的主要内容,如果未能解决你的问题,请参考以下文章

3493. 最大的和

2021夏季每日一题 week1 未完结

POJ3493 Largest Submatrix of All 1’s(单调栈)

返回一个二维整数数组中最大子数组的和

课堂练习:返回一个二维数组中最大子数组的和

返回一个整数数组中最大子数组的和