CodeForces 332B Maximum Absurdity

本文介绍了一个解决 CodeForces 332B 题目的算法,该算法通过预处理数列的前缀和来快速找到两个不重叠的指定长度子数组的最大和。代码使用 C++ 实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://codeforces.com/problemset/problem/332/B






给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠。只要对数列进行类似于求前缀和的操作,既可以加快速度,一道不算太难的预处理的题目。




#include<bits/stdc++.h>
using namespace std;
int a[222222];
long long int b[222222];
long long int c[222222];
long long int w[222222];
int main(){
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
	      int i,j;
	      int js=1;
	      memset(b,0,sizeof(b));
	      memset(c,0,sizeof(c));
	      for(i=1;i<=n;i++)
	      {
	      	scanf("%d",&a[i]);
	      	if(i>m)
	      	{
	      		b[++js]=b[js-1]-a[i-m]+a[i];
			}
			else b[1]+=a[i];
		  }
		  
		  long long int ans=-1;
		  int w1,w2;
		  w[js+1]=js;
		  for(i=js;i>=1;i--)
		  {
		  	if(b[i]>=c[i])
		  	{
		  		c[i]=b[i];
		  		c[i-1]=b[i];
		  		w[i]=i;
			  }
			  else{
			  	c[i-1]=c[i];
			  	w[i]=w[i+1];
			  }
		  }
		  for(i=1;i<=js;i++)
		  {
		  	
		  	 	if(b[i]+c[i+m]>ans)
		  	 	{
		  	 		ans=b[i]+c[i+m];
		  	 		w1=i;
		  	 		w2=w[i+m];
				   }
			   
		  }
		  cout<<w1<<" "<<w2<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值