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. 最大的和的主要内容,如果未能解决你的问题,请参考以下文章