NC15553 数学考试

数学考试

https://ac.nowcoder.com/acm/problem/15553

给定一个数组arr[ ](有正有负),选择两段子数组(子数组长度等于K)

求和最大的两段子数组,打印和

  • 先求前缀和

状态表示:

<mtext>          </mtext> l e f [ i ] ~~~~~~~~lef[i]         lef[i]表示 i i i的左边的长度为K的子数组最大和(包括 i i i)

<mtext>          </mtext> r i g [ i ] ~~~~~~~~rig[i]         rig[i]表示 i i i的右边的长度为K的子数组最大和(包括 i i i)

转移方程:

<mtext>          </mtext> l e f [ i ] = m a x ( l e f [ i 1 ] , s u m [ i ] s u m [ i K ] ) ~~~~~~~~lef[i]=max(lef[i-1],sum[i]-sum[i-K])         lef[i]=max(lef[i1],sum[i]sum[iK])

<mtext>          </mtext> r i g [ i ] = m a x ( r i g [ i + 1 ] , r i g [ i + K 1 ] s u m [ i 1 ] ) ~~~~~~~~rig[i]=max(rig[i+1], rig[i+K-1]-sum[i-1])         rig[i]=max(rig[i+1],rig[i+K1]sum[i1])

<mtext>          </mtext> a n s = m a x ( a n s , l e f [ i ] + r i g [ i + 1 ] ) ~~~~~~~~ans=max(ans,lef[i]+rig[i+1])         ans=max(ans,lef[i]+rig[i+1])
初始状态
<mtext>          </mtext> l e f [ <mtext>   </mtext> ] r i g [ <mtext>   </mtext> ] , ~~~~~~~~lef[~]和rig[~]应该初始化为最小,因为有负数         lef[ ]rig[ ],
<mtext>          </mtext> m e m s e t ( l e f , 0 x 7 f , s i z e o f ( l e f ) ) ~~~~~~~~memset(lef,-0x7f,sizeof(lef))         memset(lef,0x7f,sizeof(lef))

#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#define MAXN ((int)2e5+7)
#define ll long long 
#define int long long 
#define INF (0x7f7f7f7f)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)
void err() { cout << "\033[39;0m" << endl; }
#endif

template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }

//从一个数组里选两段长度为K的子数组a1[],a2[],要求sum_a1+sum_a2最大
int n, m, Q, K, a[MAXN], sum[MAXN];
ll lef[MAXN]; //表示位置i左边长度为K的子数组(包括i)的最大和
ll rig[MAXN]; //表示位置i右边长度为K的子数组(包括i)的最大和

signed main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	scanf("%lld ", &Q);
	while(Q--) {
		scanf("%lld %lld ", &n, &K);
		
		memset(sum, 0, sizeof(sum));
		memset(lef, -0x7f, sizeof(lef));
		memset(rig, -0x7f, sizeof(rig));
	
		for(int i=1; i<=n; i++) 
			scanf("%lld ", a+i), sum[i]=sum[i-1]+a[i];

		for(int i=K; i<=n-K; i++) 
			lef[i] = max(lef[i-1], (sum[i]-sum[i-K]));

		for(int i=n-K+1; i>=K+1; i--) 
			rig[i] = max(rig[i+1], (sum[i+K-1]-sum[i-1]));

		//forarr(lef, 1, n, "lef");
		//forarr(rig, 1, n, "rig");
		int ans = -1e18;
		for(int i=K; i<=n-K; i++) 
			ans = max(ans, lef[i]+rig[i+1]);
		printf("%lld \n", ans);
	}




#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}


全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
7319次浏览 66人参与
# 你的实习产出是真实的还是包装的? #
1411次浏览 35人参与
# 米连集团26产品管培生项目 #
5100次浏览 207人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7192次浏览 38人参与
# 简历第一个项目做什么 #
31397次浏览 317人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186626次浏览 1116人参与
# MiniMax求职进展汇总 #
23353次浏览 304人参与
# 研究所笔面经互助 #
118808次浏览 577人参与
# 面试紧张时你会有什么表现? #
30431次浏览 188人参与
# 简历中的项目经历要怎么写? #
309720次浏览 4171人参与
# AI时代,哪些岗位最容易被淘汰 #
62951次浏览 760人参与
# 职能管理面试记录 #
10753次浏览 59人参与
# 网易游戏笔试 #
6397次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160480次浏览 1107人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
7059次浏览 155人参与
# 正在春招的你,也参与了去年秋招吗? #
362921次浏览 2635人参与
# 你怎么看待AI面试 #
179558次浏览 1193人参与
# 小红书求职进展汇总 #
226969次浏览 1357人参与
# 你觉得通信/硬件有必要实习吗? #
155407次浏览 1065人参与
# 从哪些方向判断这个offer值不值得去? #
56717次浏览 357人参与
# 校招笔试 #
468444次浏览 2959人参与
# 你的房租占工资的比例是多少? #
92166次浏览 896人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务