列表

详情


NC227322. 又一最大子段和

描述

大家好,今天我们来聊聊最大子段和是怎么回事呢?最大子段和相信大家都很熟悉,但是最大子段和又是怎么回事呢?下面就让小编带大家一起了解吧。 最大子段和,其实就是最大子段和了。大家可能会感到很惊讶,最大子段和怎么......

我们将一个数列的最大子段和的值记为,现在你可以对进行若干次操作,每次操作,你可以选择数列中的一个数字,将其改为之间的任意一个数。现在,给定整数,求最少需要操作多少次可以使得

最大子段和是指选出数列中连续且非空的一段使得这段的和最大。

输入描述

输入第一行是一个整数,测试用例数。

每个测试用例的第一行包括两个数,表示数组的长度和需要达到的

每个测试用例的第二行输入n个数字,数组的个元素。

输入保证对于所有测试用例,有

输出描述

对于每个测试用例,输出一行一个整数,表示令最少所需的操作次数。

示例1

输入:

4
3 0
-1 -1 -1
3 -1
-1 -1 -1
3 -2
-1 -1 -1
7 3
2 -4 3 -1 2 -4 3

输出:

1
0
3
1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 95ms, 内存消耗: 552K, 提交时间: 2021-09-05 16:50:45

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int i,n,m,x,ans,flag,T;
	long long sum;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		flag=ans=sum=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&x);
			sum=x+max(sum,(long long)0);
			if(sum>m)sum=-1,ans++;
			else if(sum==m)flag=1;
		}
		if(!flag)ans=max(ans,1);
		printf("%d\n",ans);
	}
	return 0;
}

上一题